2015-03-06 7 views
11

volte una riga contenente un operatore ternario in Python è troppo lungo:Come fare un'interruzione di riga sull'operatore ternario Python?

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

Esiste un modo consigliato di fare un'interruzione di linea a 79 caratteri con un operatore ternario? Non l'ho trovato in PEP 8.

+0

Inserirlo tra parentesi. –

risposta

12

Si può sempre estendere un logical line across multiple physical lines con parentesi:

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

questo è chiamato implicit line joining.

Quanto sopra utilizza lo stile PEP8 tutto indentato-one-step-more (chiamato hanging indent). È possibile anche trattino linee extra per abbinare la parentesi di apertura:

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

ma questo ti lascia colpire la massima a 80 colonne tutto il più veloce.

Dove si posizionano esattamente le porzioni if e else dipende da voi; Ho usato le mie preferenze personali sopra, ma non esiste uno stile specifico per l'operatore su cui tutti siano d'accordo.

19

PEP8 dice il preferred way of breaking long lines is using parentheses:

Il modo preferito di linee lunghe è utilizzando implicita continuazione linea di pitone all'interno parentesi tonde, quadre e graffe. Le linee lunghe possono essere suddivise su più righe avvolgendo le espressioni nelle parentesi . Questi dovrebbero essere usati preferibilmente usando un backslash per la continuazione della linea.

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

Grazie per la tua risposta! Trovo le due risposte equivalenti, quindi ho accettato quello più vecchio. – nedim

+0

Upvoting per riferimento a monty python – Mark

0

Tenete a mente questi consigli da Lo Zen di Python: "conta leggibilità"

L'operatore ternario è più leggibile quando è tutto su una riga.

x = y if z else w

Quando le vostre condizioni o variabili spingere la linea oltre 79 caratteri (vedi PEP8), leggibilità comincia a soffrire. (La leggibilità è anche il motivo per cui le dict/list comprehensions sono meglio conservate.)

Quindi, piuttosto che tentare di interrompere la linea usando le parentesi, potresti trovare che sia più leggibile se lo converti in un normale blocco if.

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: I refactoring rivela un altro problema leggibilità: logica does_not_haggle viene invertito. Ciò sarebbe ancora più leggibile, se è possibile riscrivere la funzione:

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