web-dev-qa-db-fra.com

Comment faire un saut de ligne sur l'opérateur ternaire Python?

Parfois, une ligne contenant un opérateur ternaire en Python devient trop longue:

answer = 'Ten for that? You must be mad!' if does_not_haggle(brian) else "It's worth ten if it's worth a shekel."

Existe-t-il un moyen recommandé de faire une coupure de ligne à 79 caractères avec un opérateur ternaire? Je ne l'ai pas trouvé dans PEP 8 .

38
nedim

Vous pouvez toujours étendre un ligne logique sur plusieurs lignes physiques avec des parenthèses:

answer = (
    'Ten for that? You must be mad!' if does_not_haggle(brian)
    else "It's worth ten if it's worth a shekel.")

Cela s'appelle jonction implicite de ligne .

Ce qui précède utilise le style PEP8 tout en retrait, en une étape (appelé un retrait suspend ). Vous pouvez également mettre en retrait des lignes supplémentaires pour correspondre à la parenthèse d'ouverture:

answer = ('Ten for that? You must be mad!' if does_not_haggle(brian)
          else "It's worth ten if it's worth a shekel.")

mais cela vous laisse atteindre le maximum de 80 colonnes plus rapidement.

Où vous placez précisément les parties if et else; J'ai utilisé ma préférence personnelle ci-dessus, mais il n'y a pas encore de style spécifique pour l'opérateur sur lequel tout le monde est d'accord.

43
Martijn Pieters

PEP8 dit que la manière préférée de casser les longues lignes est d'utiliser des parenthèses :

La façon préférée d'enrouler les longues lignes est d'utiliser la continuation de ligne implicite de Python entre parenthèses, crochets et accolades. Les longues lignes peuvent être coupées sur plusieurs lignes en enveloppant les expressions entre parenthèses. Ceux-ci doivent être utilisés de préférence à l'utilisation d'une barre oblique inverse pour la poursuite de la ligne.

answer = ('Ten for that? You must be mad!'
          if does_not_haggle(brian)
          else "It's worth ten if it's worth a shekel.")
36
Peter Wood

Gardez à l'esprit ce conseil de Le Zen de Python: "La lisibilité compte."

L'opérateur ternaire est plus lisible lorsqu'il est sur une seule ligne.

x = y if z else w

Lorsque vos conditions ou variables repoussent la ligne au-delà de 79 caractères (voir PEP8), la lisibilité commence à en souffrir. (La lisibilité est également la raison pour laquelle les compréhensions dict/list sont mieux gardées courtes.)

Ainsi, plutôt que d'essayer de couper la ligne à l'aide de parenthèses, vous pourriez trouver qu'elle est plus lisible si vous la convertissez en un bloc if normal.

if does_not_haggle(brian):
    answer = 'Ten for that? You must be mad!'
else:
    answer = "It's worth ten if it's worth a shekel."

BONUS: le refactoring ci-dessus révèle un autre problème de lisibilité: does_not_haggle est une logique inversée. Ce serait encore plus lisible, si vous pouvez réécrire la fonction:

if haggles(brian):
    answer = "It's worth ten if it's worth a shekel."
else:
    answer = 'Ten for that? You must be mad!'
5
John Anderson