2009-12-21 20 views
8

En python 2.6, ¿por qué es válida la siguiente línea?Rasgos de sintaxis o por qué es ese pitón válido

my_line = 'foo' 'bar' 

y si eso es válido, ¿por qué no es lo siguiente:

my_list = 1 2 

El primer ejemplo es la concatenación de cadenas, sin embargo, lo siguiente no es válida o bien (gracias a Dios):

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

hago no veo el punto en "eliminar" espacios en blanco como parece su ejemplo 'my_list = 1 2' parece sugerir. – jldupont

+0

No sugiere eso. Lo que sugiero es que este aspecto de la sintaxis de Python es inconsistente (imho). –

+3

Vea este PEP http://www.python.org/dev/peps/pep-3126/ donde se discute extensamente. – stephan

Respuesta

20

Esto está haciendo string literal concatenation. Como se ha señalado en la documentación, las ventajas se incluyen los siguientes:

Esta característica se puede utilizar para reducir el número de barras invertidas necesarios, para dividir cadenas largas convenientemente a través de largas líneas, o incluso añadir comentarios a piezas de cadenas ...

se señala a continuación que esta concatenación se realiza en tiempo de compilación en lugar de correr el tiempo.

El historial y la razón detrás de esto, y una sugerencia rechazada para eliminar la característica, se describe en PEP 3126.

8

my_line = 'foo' 'bar' es una concatenación de cadenas.

+3

Todavía funciona en Python 3.1 pero no me gusta mucho. –

+0

@Ipthnc yo también. Afortunadamente, no he encontrado el código escrito de esta manera, y espero que nunca tenga que hacerlo ... ¡Estoy seguro de que me olvidaré de lo que significa! –

+0

Puede ser útil cuando se "genera automáticamente" el código, pero aparte de esto, no veo la ventaja (si existe). – jldupont

5

No es inconsistente. Las cadenas y los enteros tienen diferentes métodos.

La concatenación de enteros no tiene sentido.

La concatenación de cadenas es un comportamiento predeterminado significativo.

6

Quizás esto es de ascendencia de C. En C, el siguiente es perfectamente válido:

char* ptr = "hello " "world"; 

Está implementado por el C pre-processor (cpp), y la razón se da en dicho enlace es:

esto permite que las cadenas largas se dividan a través de múltiples líneas , y también permite literales de cadena resultantes de C define preprocesador y macros para ser anexa a cadenas en tiempo de compilación

Cuestiones relacionadas