Qual è la regola di sintassi per avere virgole finali nelle definizioni di tupla?


119

Nel caso di una tupla a singolo elemento, è richiesta la virgola finale.

a = ('foo',)

Che ne dici di una tupla con più elementi? Sembra che se la virgola finale esista o meno, sono entrambe valide. È corretto? Avere una virgola finale è più facile da modificare secondo me. È un cattivo stile di codifica?

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)

Risposte:


73

In tutti i casi, tranne la tupla vuota, la virgola è la cosa importante. Le parentesi sono richieste solo quando richieste per altri motivi sintattici: per distinguere una tupla da un insieme di argomenti di funzione, precedenza di operatori o per consentire interruzioni di riga.

La virgola finale per tuple, elenchi o argomenti di funzioni è di buon gusto soprattutto quando si dispone di una lunga inizializzazione divisa su più righe. Se includi sempre una virgola finale, non aggiungerai un'altra riga alla fine aspettandoti di aggiungere un altro elemento e creando invece un'espressione valida:

a = [
   "a",
   "b"
   "c"
]

Supponendo che sia iniziato come un elenco di 2 elementi che è stato successivamente esteso, è andato storto in un modo forse non immediatamente ovvio. Includere sempre la virgola finale e si evita quella trappola.


3
Per i motivi sopra esposti, lasciare la virgola può essere vantaggioso. D'altra parte, l'adozione di questa abitudine può portare a mal di testa se hai a che fare anche con JavaScript o JSON altrove nella tua applicazione, dal momento che ad alcuni browser non piace.
Cito

7
Sì, ma non dovresti mai costruire JSON a mano, quindi non importa, e per Javascript usa sempre jslint o equivalente per catturare quel tipo di errore prima che si avvicini a un browser.
Duncan

100

È richiesto solo per le tuple di un singolo elemento per disambiguare la definizione di una tupla o di un'espressione racchiusa tra parentesi.

(1)  # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1

Per più di un elemento, non è più necessario poiché è perfettamente chiaro che si tratta di una tupla. Tuttavia, la virgola finale è consentita per semplificare la definizione utilizzando più righe. Puoi aggiungere alla fine o riorganizzare gli elementi senza interrompere la sintassi perché hai tralasciato una virgola per sbaglio.

per esempio,

someBigTuple = (
                   0,
                   1,
                   2,
                   3,
                   4,
                   5,
                   6,
                   7,
                   8,
                   9,
                   10,
                   #...
                   10000000000,
               )

Nota che questo vale anche per altre raccolte (ad esempio elenchi e dizionari) e non solo per le tuple.


5
+1 per sottolineare che questo è valido anche per altre cose oltre alle tuple. Questo è così utile per averne uno key: value,per riga e non prendersi cura della virgola quando si aggiungono nuove cose.
Joël

46

Un altro vantaggio delle virgole finali è che rende le differenze più gradevoli. Se hai iniziato con

a = [
    1,
    2,
    3
]

e lo ha cambiato in

a = [
    1,
    2,
    3,
    4
]

Il diff sarebbe simile

 a = [
     1,
     2,
-    3
+    3,
+    4
 ]

Considerando che se avessi iniziato con una virgola finale, come

a = [
    1,
    2,
    3,
]

Quindi il diff sarebbe solo

 a = [
     1,
     2,
     3,
+    4,
 ]

Questo è davvero più un commento che una risposta alla domanda originale, ma mi piace molto l'argomento aggiunto a favore delle virgole finali.
Mad Physicist

13

È opzionale: vedi il wiki di Python .

Riepilogo: le tuple a un elemento richiedono una virgola finale , ma è facoltativo per le tuple a più elementi.


8

Inoltre, considera la situazione in cui desideri:

>>> (('x','y'))*4                         # same as ('x','y')*4
('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
#Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

Quindi in questo caso le parentesi esterne non sono altro che raggruppare parentesi. Per renderli tupla è necessario aggiungere una virgola finale. vale a dire

>>> (('x','y'),)*4 
(('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

6

La virgola finale è richiesta solo per le tuple di un elemento. La presenza di una virgola finale per tuple più grandi è una questione di stile e non è richiesta. Il suo più grande vantaggio è la differenza pulita sui file con tuple di grandi dimensioni su più righe che vengono spesso modificate (ad esempio le tuple di configurazione).


6

È una risposta semplice.

a = ("s") è una stringa

e

a = ("s",) è una tupla con un elemento.

Python necessita di una virgola aggiuntiva in caso di una tupla di un elemento, distinguere tra stringa e tupla.

Ad esempio, prova questo sulla console python:

a = ("s")

a = a + (1,2,3)

Traceback (la chiamata più recente per ultima):

File stdin, riga 1, nel modulo

TypeError: impossibile concatenare gli oggetti "str" ​​e "tuple"


4

Un altro motivo per cui questo esiste è che rende la generazione di codice e le __repr__funzioni più facili da scrivere. Ad esempio, se hai un oggetto costruito come obj(arg1, arg2, ..., argn), puoi semplicemente scrivere obj.__repr__come

def __repr__(self):
    l = ['obj(']
    for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn)
        l.append(repr(arg))
        l.append(', ')
    l.append(')')
    return ''.join(l)

Se una virgola finale non è consentita, dovresti inserire in un caso speciale l'ultimo argomento. In effetti, potresti scrivere quanto sopra in una riga usando una lista di comprensione (l'ho scritto più a lungo per renderlo più facile da leggere). Non sarebbe così facile farlo se dovessi fare un caso speciale nell'ultimo trimestre.


2
Non ci sarebbe alcun bisogno di speciali caso l'ultimo argomento, si potrebbe utilizzare joinin quel caso: def __repr__(self): 'obj(' + ', '.join([repr(arg) for arg in obj.args]) + ')'.
Suzanne Dupéron,

Aiuta anche con la generazione di codice, anche da strumenti che non sono scritti in Python e non hanno funzioni piacevoli come join.
asmeurer

2

PEP 8 - Guida allo stile per il codice Python - Quando utilizzare le virgole finali

Le virgole finali sono solitamente opzionali, tranne per il fatto che sono obbligatorie quando si crea una tupla di un elemento (e in Python 2 hanno la semantica per l'istruzione print). Per chiarezza, si consiglia di racchiudere quest'ultimo tra parentesi (tecnicamente ridondanti).

Sì:

FILES = ('setup.cfg',)

OK, ma confuso:

FILES = 'setup.cfg',

Quando le virgole finali sono ridondanti, sono spesso utili quando viene utilizzato un sistema di controllo della versione, quando ci si aspetta che un elenco di valori, argomenti o elementi importati venga esteso nel tempo. Lo schema consiste nel mettere ogni valore (ecc.) Su una riga da solo, aggiungendo sempre una virgola finale, e aggiungere la parentesi chiusa / parentesi / parentesi graffa sulla riga successiva. Tuttavia non ha senso avere una virgola finale sulla stessa riga del delimitatore di chiusura (tranne nel caso precedente di tuple singleton).

Sì:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
initialize(FILES,
           error=True,
           )

No:

FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)

-5

Lo stile di codifica è il tuo gusto, se pensi che lo standard di codifica sia importante, c'è un PEP-8 che può guidarti.

Cosa ne pensi del risultato della seguente espressione?

x = (3)
x = (3+2)
x = 2*(3+2)

Sì, x è solo un numero.


1
questo è un modo povero di spiegare la tua linea di pensiero. Esplicito è meglio che implicito.
Guilherme David da Costa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.