2009-12-21 5 views
8

In Python 2.6, warum ist die folgende Zeile gültig?Syntax-Quirks oder warum ist das gültige Python

my_line = 'foo' 'bar' 

und wenn das gültig ist, warum ist nicht das:

my_list = 1 2 

Das erste Beispiel String-Verkettung ist jedoch folgendes gilt nicht, entweder (Gott sei Dank):

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

ich tun nicht den Punkt in "Entfernen" von Leerstellen sehen, wie Ihr 'my_list = 1 2' Beispiel zu suggerieren scheint. – jldupont

+0

Es schlägt das nicht vor. Ich schlage vor, dass dieser Aspekt der Python-Syntax inkonsistent ist (imho). –

+3

Siehe diese PEP http://www.python.org/dev/peps/pep-3126/ wo es ausführlich diskutiert wird. – stephan

Antwort

20

Dies geschieht string literal concatenation. Wie in der Dokumentation erwähnt, sind Vorteile die folgende:

Diese Funktion verwendet werden kann, die Anzahl der Schrägstriche benötigt wird, zu reduzieren, zu spalten lange Strings bequem über lange Linien oder sogar, um Kommentare hinzufügen zu Teile von Strings ...

Es geht weiter zu beachten, dass diese Verkettung bei der Kompilierung statt Laufzeit erfolgt.

Die Geschichte und Begründung dahinter, und ein abgelehnter Vorschlag, das Feature zu entfernen, wird in PEP 3126 beschrieben.

8

my_line = 'foo' 'bar' ist String-Verkettung.

+3

Funktioniert immer noch in Python 3.1, aber ich mag es nicht sehr. –

+0

@Ipthnic mich auch. Glücklicherweise bin ich nicht auf Code gestoßen, der auf diese Weise geschrieben wurde, und ich hoffe, ich muss nie ... Ich bin sicher, ich werde vergessen, was zum Teufel es bedeutet! –

+0

Es könnte nützlich sein, wenn Code automatisch generiert wird, aber abgesehen davon kann ich den Vorteil (falls vorhanden) nicht sehen. – jldupont

5

Es ist nicht inkonsistent. Strings und Ganzzahlen haben unterschiedliche Methoden.

Integer-Verkettung ist bedeutungslos.

String-Verkettung ist ein sinnvolles Standardverhalten.

6

Vielleicht ist dies von C Abstammung. In C ist die folgende perfekt gültig:

char* ptr = "hello " "world"; 

Es wird von der C implementiert ist pre-processor (cpp), und die Begründung in dieser Verbindung gegeben ist:

dies ermöglicht lange Strings über mehrere Zeilen aufgeteilt werden und ermöglicht auch Stringliterale von C Präprozessor definiert und Makros resultierenden Strings bei der Kompilierung sein beigefügten

Verwandte Themen