web-dev-qa-db-fra.com

Comment puis-je faire en sorte que mon code Python reste sous 80 caractères par ligne?

J'ai écrit quelques Python dans lesquels certaines lignes dépassent 80 caractères, ce qui est un seuil que je dois respecter. Comment puis-je adapter mon code pour réduire la longueur des lignes?

54
sahana

Mon éditeur actuel (Kate) a été configuré pour introduire un saut de ligne sur les limites de Word chaque fois que la longueur de ligne atteint ou dépasse 80 caractères. Cela rend immédiatement évident que j'ai dépassé les limites. De plus, il y a une ligne rouge marquant la position des 80 caractères, m'informant à l'avance du moment où la ligne va déborder. Ceux-ci me permettent de planifier des lignes logiques qui s'adapteront à plusieurs lignes physiques.

Quant à savoir comment les adapter, il existe plusieurs mécanismes. Vous pouvez terminer la ligne avec un \, mais cela est sujet aux erreurs.

# works
print 4 + \
    2

# doesn't work
print 4 + \ 
    2

La différence? La différence est invisible - il y avait un caractère espace après la barre oblique inverse dans le deuxième cas. Oups!

Que faut-il faire à la place? Eh bien, entourez-le entre parenthèses.

print (4 + 
    2)

Pas besoin. Cela fonctionne réellement universellement, vous n'aurez jamais besoin de \. Même pour les limites d'accès aux attributs!

print (foo
    .bar())

Pour les chaînes, vous pouvez les ajouter explicitement ou implicitement à l'aide de la jointure de style C.

# all of these do exactly the same thing
print ("123"
    "456")
print ("123" + 
    "456")
print "123456"

Enfin, tout ce qui sera sous n'importe quelle forme de parenthèse ((), []. {}), Pas seulement les parenthèses en particulier, peut avoir un saut de ligne placé n'importe où. Ainsi, par exemple, vous pouvez très bien utiliser un littéral de liste sur plusieurs lignes, tant que les éléments sont séparés par une virgule.

Tout cela et bien plus peut être trouvé dans la documentation officielle pour Python. En outre, une note rapide, PEP-8 spécifie 79 caractères comme limite, pas 80-- si vous avez 80 caractères, vous l'avez déjà dépassé.

58
Devin Jeanpierre

Si le code dépassant 80 caractères est un appel de fonction (ou une définition), coupez la ligne d'argument. Python reconnaîtra la parenthèse et la voit comme une seule ligne.

function(arg, arg, arg, arg,
         arg, arg, arg...)

Si le code dépassant 80 caractères est une ligne de code qui n'est pas naturellement cassable, vous pouvez utiliser la barre oblique inversée \ pour "échapper" à la nouvelle ligne.

some.weird.namespace.thing.that.is.long = ','.join(strings) + \
                                          'another string'

Vous pouvez également utiliser la parenthèse à votre avantage.

some.weird.namespace.thing.that.is.long = (','.join(strings) +
                                           'another string')

Tous les types de parenthèses d'ensemble {} (dict/set), [] (liste), () (tuples) peuvent être coupés sur plusieurs lignes sans problème. Cela permet un formatage plus agréable.

mydict = {
    'key': 'value',
    'yes': 'no'
}
22
Tor Valamo

Python idiomatique dit:

Utilisez les barres obliques inversées en dernier recours

Donc, si l'utilisation de parenthèses () Est possible, évitez les barres obliques inverses. Si vous avez une a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines.across.the.whole.trainyard.and.several.states() faites quelque chose comme:

lines = a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines
lines.across.the.whole.trainyard.and.several.states()

Ou, de préférence, refactorisez votre code. S'il vous plaît.

18
Kimvais

J'ajouterais deux points aux réponses précédentes:

Les chaînes peuvent être automatiquement concaténées, ce qui est très pratique:

this_is_a_long_string = ("lkjlkj lkj lkj mlkj mlkj mlkj mlkj mlkj mlkj "
                         "rest of the string: no string addition is necessary!"
                         " You can do it many times!")

Notez que cela est efficace: cela ne pas entraîne des concaténations de chaînes calculées lorsque le code est exécuté: au lieu de cela, il est directement considéré comme un seul littéral de chaîne longue, il est donc efficace.

Une petite mise en garde liée à la réponse de Devin: la syntaxe "parenthèse" ne fonctionne pas "universellement". Par exemple, d [42] = "H22G" ne peut pas être écrit comme

(d
 [42] = "H2G2")

car les parenthèses ne peuvent être utilisées que autour d'une expression "calculée" (cela n'inclut pas une affectation (=) comme ci-dessus).

Un autre exemple est le code suivant, qui génère une erreur de syntaxe:

with (open("..... very long file name .....")
      as input_file):

En fait, les parenthèses ne peuvent pas être placées autour des instructions, plus généralement (uniquement des expressions).

Dans ces cas, on peut soit utiliser la syntaxe "\", ou mieux (puisque "\" est à éviter si possible), diviser le code sur plusieurs instructions.

18
Eric O Lebigot