2011-12-30 17 views
63

Dalla lettura PEP-8, ho capito che si dovrebbe mettere la parentesi di chiusura sulla stessa linea come ultimo argomento in chiamate di funzione:metodo Incatenato chiama stile di rientro in Python

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False) 

Probabilmente, lunghe espressioni sono meglio evitare per niente. Ma se è indesiderabile, , come andresti su più chiamate con metodi concatenati? Il paren di chiusura dovrebbe essere su una nuova linea?

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False 
).values_list('value', flat=True) 

E i metodi senza argomenti? Come scriverli su più righe senza fare riferimento ai valori di ritorno intermedi?

ShortName.objects.distinct(
    ).filter().values() # looks ugly 

Aggiornamento: C'è una domanda di duplicato How to break a line of chained methods in Python?. Lo accepted answer suggerisce uno stile familiare di jQuery di iniziare ogni nuova riga con un punto. L'autore non fornisce alcuna motivazione o riferimento autorevole, quindi mi piacerebbe avere una conferma su tale stile o un'alternativa.

risposta

103

Questo è un caso in cui è preferibile un carattere di continuazione di riga per aprire parentesi.

ShortName.objects.distinct() \ 
     .filter().values()  # looks better 

La necessità di questo stile diventa più evidente come nomi di metodo si allungano e come metodi iniziare a prendere argomenti:

return some_collection.get_objects(locator=l5) \ 
         .get_distinct(case_insensitive=True) \ 
         .filter(predicate=query(q5)) \ 
         .values() 

PEP 8 è destinato ad essere interpretato con una misura di buon senso e di un occhio sia per il pratico che per il bello. Violare felicemente qualsiasi linea guida PEP 8 che risulta in un codice brutto o difficile da leggere.

Detto questo, se vi trovate spesso in contrasto con PEP 8, può essere un segno che ci sono problemi di leggibilità che trascendono la vostra scelta di spazi bianchi :-)

+1

Mi piace questo approccio. Ha anche il grande vantaggio di poter spostare le linee senza preoccuparsi della punteggiatura (tranne la prima e l'ultima riga). Uso principalmente le chiamate concatenate quando mi occupo di query SQLAlchemy complesse ed è bello poterle riordinare facilmente. –

+1

Sembra davvero meglio, e hai anche indentato il commento. Grazie! – katspaugh

+0

Raymond, qual è la ragione per cui Python non consente la nuova riga prima e dopo un punto? Ciò rende più difficile la formattazione più difficile ... –

35

penso che il migliore è quello di utilizzare () per forzare la linea che unisce, e per fare questo:

(ShortName.objects.distinct() # Look ma! 
.filter(product__photo__stickitem__isnull=False) # Comments are allowed 
.values_list('value', flat=True)) 

non è l'ideale, ma mi piace che si distingue visivamente e lo rende in qualche modo evidente quanto la catena di chiamate è. Permette i commenti di fine linea, che non lo è con la newline \.

+26

Non mi interessa per quello. La parentesi aperta urla "STO COSTRUENDO UNA COPPIA!" a me e ai miei occhi inizia a dare la caccia per vedere cosa si farà con esso. –

+0

Costruire una 'tupla' può anche significare * avviare una (serie di) interpretazioni * - wow, questo è quello che intendo ..! –

+0

In che modo Python lo distingue effettivamente da una tupla? o0 – Zelphir

Problemi correlati