2009-12-21 14 views
8

In python 2.6, perché è valida la seguente riga?Quinnks di sintassi o perché è quel python valido

my_line = 'foo' 'bar' 

e se è valida, perché non è il seguente:

my_list = 1 2 

Il primo esempio è stringa di concatenazione, tuttavia, la seguente non è valido o (grazie a dio):

foo = 'foo' 
bar = 'bar' 
foo_bar = foo bar 
+1

faccio non vedo il punto di "rimuovere" gli spazi bianchi come sembra suggerire l'esempio di 'my_list = 1 2'. – jldupont

+0

Non lo suggerisce. Quello che suggerisco è che questo aspetto della sintassi Python è incoerente (imho). –

+3

Vedere questo PEP http://www.python.org/dev/peps/pep-3126/ dove è ampiamente discusso. – stephan

risposta

20

Questo sta facendo string literal concatenation. Come indicato nella documentazione, i vantaggi sono i seguenti:

Questa funzione può essere utilizzata per ridurre il numero di backslash necessari, per dividere lunghe stringhe comodamente su lunghe linee, o anche per aggiungere commenti a parti di stringhe ...

si fa poi notare che questo concatenamento è fatto al momento della compilazione piuttosto che correre il tempo.

La storia e le motivazioni alla base di questo e un suggerimento rifiutato di rimuovere la funzionalità sono descritti in PEP 3126.

8

my_line = 'foo' 'bar' è una concatenazione di stringhe.

+3

Funziona ancora in Python 3.1 ma non mi piace molto. –

+0

@Ipthnc anche a me. Fortunatamente non ho trovato il codice scritto in questo modo, e spero di non doverlo mai ... sono sicuro che dimenticherò che diamine vuol dire! –

+0

Potrebbe essere utile quando il codice "auto-generante", ma a parte questo, non riesco a vedere il vantaggio (se presente). – jldupont

5

Non è incoerente. Le stringhe e gli interi hanno metodi diversi.

La concatenazione di interi non ha significato.

La concatenazione di stringhe è un comportamento predefinito significativo.

6

Forse questo è l'ascendenza di C. In C, il seguente è perfettamente valida:

char* ptr = "hello " "world"; 

È attuato dalla C pre-processor (cpp), e la motivazione data a quel collegamento è:

questo permette lunghe stringhe da dividere su più righe , e permette anche stringhe risultanti da C definisce preprocessore e macro siano allegata stringhe in fase di compilazione

Problemi correlati