185 votes

Comment rompre une ligne de méthodes enchaînées en Python ?

J'ai une ligne du code suivant (ne blâmez pas les conventions de nommage, elles ne sont pas de moi) :

subkeyword = Session.query(
    Subkeyword.subkeyword_id, Subkeyword.subkeyword_word
).filter_by(
    subkeyword_company_id=self.e_company_id
).filter_by(
    subkeyword_word=subkeyword_word
).filter_by(
    subkeyword_active=True
).one()

Je n'aime pas ce que cela donne (pas très lisible) mais je n'ai pas de meilleure idée pour limiter les lignes à 79 caractères dans cette situation. Y a-t-il une meilleure façon de le faire (de préférence sans antislashs) ?

323voto

sth Points 91594

Vous pourriez utiliser des parenthèses supplémentaires :

subkeyword = (
    Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
    .filter_by(subkeyword_company_id=self.e_company_id)
    .filter_by(subkeyword_word=subkeyword_word)
    .filter_by(subkeyword_active=True)
    .one()
)

72voto

Raymond Hettinger Points 50330

Il s'agit d'un cas où un caractère de continuation de ligne est préféré aux parenthèses ouvertes. La nécessité de ce style devient plus évidente à mesure que les noms de méthodes deviennent plus longs et que les méthodes commencent à prendre des arguments :

subkeyword = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) \
                    .filter_by(subkeyword_company_id=self.e_company_id)          \
                    .filter_by(subkeyword_word=subkeyword_word)                  \
                    .filter_by(subkeyword_active=True)                           \
                    .one()

PEP 8 est destiné à être interprété avec une mesure de bon sens et un œil pour le pratique et le beau. Transgressez volontiers toute directive PEP 8 qui aboutit à un code laid ou difficile à lire.

Ceci étant dit, si vous vous trouvez fréquemment en désaccord avec PEP 8, c'est peut-être le signe qu'il y a des problèmes de lisibilité qui transcendent votre choix d'espaces blancs :-)

21voto

pkoch Points 1189

Mon choix personnel serait :

subkeyword = Session.query(
    Subkeyword.subkeyword\_id,
    Subkeyword.subkeyword\_word,
).filter\_by(
    subkeyword\_company\_id=self.e\_company\_id,
    subkeyword\_word=subkeyword\_word,
    subkeyword\_active=True,
).one()

12voto

Ivo van der Wijk Points 7239

Il suffit de stocker le résultat/objet intermédiaire et d'invoquer la méthode suivante sur celui-ci, par exemple.

q = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
q = q.filter_by(subkeyword_company_id=self.e_company_id)
q = q.filter_by(subkeyword_word=subkeyword_word)
q = q.filter_by(subkeyword_active=True)
subkeyword = q.one()

9voto

C'est une solution un peu différente de celles proposées par d'autres, mais c'est une de mes préférées car elle conduit parfois à une métaprogrammation intéressante.

base = [Subkeyword.subkeyword_id, Subkeyword_word]
search = {
    'subkeyword_company_id':self.e_company_id,
    'subkeyword_word':subkeyword_word,
    'subkeyword_active':True,
    }
subkeyword = Session.query(*base).filter_by(**search).one()

Il s'agit d'une bonne technique pour construire des recherches. Passez en revue une liste de conditionnels à extraire de votre formulaire de requête complexe (ou des déductions basées sur des chaînes de caractères concernant ce que l'utilisateur recherche), puis faites exploser le dictionnaire dans le filtre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X