Ist ein Doppelpunkt in Pythonblöcken technisch notwendig?

19

Dies ist wirklich nur eine theoretische Frage eines Python-Neulings, der mehr verstehen möchte.

Ich vergesse immer wieder den Doppelpunkt nach den ersten Anweisungen des Blocks in Python. Das meine ich:

  • for <variable> in <sequence>:
  • if <blah blah>:

Meiner Meinung nach ist ein Grund, den ich immer wieder vergesse, dass sie de facto implizit sind: Doppelpunkt oder nicht, die Aussage endet mit dieser Zeile.

Meine Frage - die ich stelle, um zu erfahren, wie die Python-Syntax funktioniert - ist, ob der Doppelpunkt wirklich unnötig ist. Würde ich die Python-Syntax so ändern, dass der Doppelpunkt nicht mehr benötigt wird, würde irgendetwas kaputt gehen? Würde das einige Aussagen mehrdeutig oder unmöglich machen?

Tomáš Zato - Setzen Sie Monica wieder ein
quelle
4
Ich glaube, Sie verstehen die Frage nicht, ob die Doppelpunkte für die Syntax erforderlich sind. Unabhängig davon, wie Ihre Antwort lautet, sollte sie auch eine Erklärung enthalten.
Tomáš Zato - Wiedereinsetzung von Monica am
Vielleicht können Sie Teile der Frage umformulieren, damit ich von Ihrem Einblick in diese Angelegenheit profitieren kann, vielleicht von einem Beispiel? Sie wären der beste Richter, ich glaube, ich habe keine Ahnung von Ihrer Absicht zu fragen. Meinen Sie das auf der Ebene des Interpreter / Compiler-Parsers? Vielen Dank.
Bhan am
Ich weiß nicht, wie ich es besser ausdrücken soll. Meine Frage ist im Grunde, wenn Sie alle Python - Syntax so verändern könnte , dass es nicht mehr braucht Doppelpunkt nach if, else, whileund so weiter. Wäre Python in diesem Fall immer noch eine Sprache, die ohne Mehrdeutigkeit verwendet werden kann?
Tomáš Zato - Wiedereinsetzung von Monica am
Ich habs! Es ist eine Frage rund um Syntax Design des Python Entscheidungen . Entschuldigung, habe es falsch verstanden. Danke für die Erklärung.
Bhan am
Spekulieren. Es ist, als ob die Zeilenumbrüche für Interpreter / Parser in der Praxis schwerer zu erkennen sind oder der Lesbarkeit dienen. In LUA können Sie if .. then .. endin einer einzelnen Zeile schreiben . Also wird hier in Python thendurch zwei Dinge ein :und ein erforderlicher Zeilenumbruch ersetzt. Eine davon erscheint überflüssig.
Bhan am

Antworten:

9

Ja, der Doppelpunkt ist erforderlich, um bestimmte Konstrukte zu disambiguieren. Betrachten Sie zum Beispiel if x - y < z: pass. Ohne den Doppelpunkt können wir nicht entscheiden, wie dies analysiert werden soll, ohne den Kontext von x, y und z zu kennen. if x: -y < z...ist gültig, wenn x boolesch ist, if x - y < z:ist sonst gültig.

Da es für eine Programmiersprache eine sehr gute Idee ist, dass Sie eine Anwendung nicht bis zu dem Punkt ausführen müssen, an dem Sie sie kompilieren, um sie analysieren zu können, ist der Doppelpunkt sehr wichtig. Sie könnten es fallen lassen, aber Sie würden andere Wege brauchen, um zu unterscheiden.

Phoshi
quelle
1
Warten Sie, Sie können eine Anweisung nach dem Doppelpunkt in der gleichen Zeile haben? Ich war mir ziemlich sicher, dass das nicht erlaubt ist.
Tomáš Zato - Wiedereinsetzung von Monica am
1
Es ist erlaubt, aber nur mit einem Zeilenumbruch danach.
Phoshi
Immer noch ein bisschen verwirrt. Ist das erlaubt: if condition: print("Condition passed")\nerlaubt? Das \nsymbolisiert eine neue Zeile nach der print-Anweisung.
Tomáš Zato - Wiedereinsetzung von Monica am
Sicher, versuch es einfach.
RemcoGerlich
1
@TomasZato: ja du kannst irgendwelche Aussagen nach dem Doppelpunkt haben. Der Block wird sofort beendet, daher ist dies vor allem dann nützlich, wenn der Block ein kleiner Einzeiler ist.
Lie Ryan
14

Der Doppelpunkt ist grammatikalisch nicht wirklich notwendig, wenn Python in einer anderen Welt entworfen wurde, ist es durchaus vorstellbar, dass der Sprachdesigner sich nicht entscheidet, den Doppelpunkt zu fordern. Und Sprachen wie Cobra tun dies in der Tat.

Der Hauptgrund, warum Doppelpunkt in Python erforderlich ist, ist die menschliche Lesbarkeit. So zitieren Sie aus Python FAQ :

Warum werden für die if / while / def / class-Anweisungen Doppelpunkte benötigt?

Der Doppelpunkt ist in erster Linie erforderlich, um die Lesbarkeit zu verbessern (eines der Ergebnisse der experimentellen ABC-Sprache). Bedenken Sie:

if a == b
    print(a)

gegen

if a == b:
    print(a)

Beachten Sie, dass der zweite etwas leichter zu lesen ist. Beachten Sie ferner, wie ein Doppelpunkt das Beispiel in dieser FAQ-Antwort auslöst. Es ist eine Standardsprache in Englisch.

Ein weiterer kleiner Grund ist, dass der Doppelpunkt Editoren das Hervorheben der Syntax erleichtert. Sie können nach Doppelpunkten suchen, um zu entscheiden, wann der Einzug erhöht werden muss, anstatt den Programmtext genauer analysieren zu müssen.

Wie auch in den FAQ erwähnt, erleichtert der Doppelpunkt die Verarbeitung von Python-Code, ohne die Sprache vollständig zu analysieren. Jeder Textprozessor, der über einen vollwertigen Parser verfügt, einschließlich des Python-Compilers, kann auf den Doppelpunkt verzichten, wenn er nicht benötigt wurde oder optional ist, wenn er eindeutig ist.

Lüge Ryan
quelle
3
„Beachten Sie, dass der zweite etwas leichter zu lesen ist.“ Ich finde den ersten leichter zu lesen. Weniger Lärm.
User76284
10

Es ist nicht notwendig für den Computer, sondern für den Menschen.

Guido van Rossum (Schöpfer von Python) hatte eine Zeit lang einen Python-Geschichtsblog. Der Doppelpunkt wurde in ABC eingeführt , der Quelle vieler Funktionen von Python.

In diesem Blogbeitrag über "Karin Dewar, Einrückung und der Doppelpunkt" schreibt Guido:

Und hier werde ich auf Lamberts Bitte hin umschreiben.

1978 verglichen Robert Dewar, Peter King, Jack Schwartz und Lambert in einer Entwurfssitzung in einem Herrenhaus in Jabłonna (Polen) verschiedene alternative Syntaxvorschläge für B, indem sie (fehlerhafte) Implementierungen für die Blasensortierung verglichen, die in jeder Alternative niedergeschrieben waren. Da sie sich nicht einigen konnten, wurde Robert Dewars Frau aus ihrem Zimmer gerufen und nach ihrer Meinung gefragt, wie ein modernes Paris die Schönheit von Hera, Athena und Aphrodite vergleichen wollte. Nachdem ihr die erste Version erklärt worden war, bemerkte sie: "Du meinst, in der Zeile, in der 'FOR i ...' steht, muss das für die folgenden Zeilen gemacht werden, nicht nur für diese Zeile? ! " Und hier stellten die Wissenschaftler fest, dass das Missverständnis vermieden worden wäre, wenn am Ende dieser Zeile ein Doppelpunkt gestanden hätte.

( B hier ist eine Reihe von Prototypsprachen B0, B1, ..., die zu ABC führten. Es ist nicht die B-Sprache, die der Vorgänger von C ist).

Ich erinnere mich auch daran, dass Guido in den 90er Jahren darauf hingewiesen hat, dass dies zum Vorteil der Redakteure war, die automatisch einen Einzug nach einer Zeile einfügen können, die mit einem Doppelpunkt endet. Aber dafür habe ich noch keine Quelle gefunden.

RemcoGerlich
quelle
4

Die Syntax der Cobra-Programmiersprache ist stark von der von Python inspiriert und macht den Doppelpunkt überflüssig. Es scheint also, dass dies nicht unbedingt erforderlich ist. Es reicht jedoch nicht aus, nur den Doppelpunkt zu entfernen , sondern es sind weitere Änderungen an der Syntax erforderlich. Siehe zum Beispiel diesen Code aus einem meiner Spielzeugprojekte :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Ohne den Doppelpunkt, um den Körper von der Parameterliste zu trennen, müsste ich Einrückung verwenden:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Ich glaube, frühere Versionen von Cobra haben den Doppelpunkt optional gemacht. Sie können entweder Einrückungen oder einen Doppelpunkt oder beides verwenden. Ähnlich wie in Ruby, wo es Schlüsselwörter gibt, um die verschiedenen Teile von Steuerausdrücken zu trennen, aber Sie können auch Ausdruckstrennzeichen (Semikolon oder Zeilenvorschub) verwenden:

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

In aktuellen Cobra-Versionen können Sie ein Komma verwenden:

if x
    y

kann geschrieben werden als

if x, y

Sie benötigen eine Möglichkeit, die verschiedenen Teile von Steuerelementausdrücken oder -definitionen zu trennen. In Python ist das der Doppelpunkt. Wenn Sie den Doppelpunkt entfernen, müssen Sie ihn durch etwas anderes ersetzen, z . B. durch erzwungenes Einrücken. Nur das Entfernen des Doppelpunkts wird nicht funktionieren.

Die einzige Möglichkeit, absolut sicher zu sein, besteht darin, die Syntax mit und ohne Doppelpunkt zu formalisieren und ihre Eindeutigkeit zu beweisen.

Beachten Sie jedoch, dass einer der Aphorismen des Zen von Python "Explizit ist besser als Implizit" ist, sodass die explizite Abgrenzung von Blöcken mit Doppelpunkten zur allgemeinen Philosophie von Python zu passen scheint. In den häufig gestellten Fragen zu Design und Verlauf wird auch erwähnt, dass diese Entscheidung auf empirischen Beweisen von Pythons Vorgänger ABC basiert.

Jörg W. Mittag
quelle
3
Nun, mit dieser im letzten Absatz beschriebenen Philosophie könnten Sie am Ende jeder Zeile einen Doppelpunkt verlangen. Explizit gegen implizit ist nur sinnvoll, wenn explizit tatsächlich Informationen hinzufügt (z. B. die implizite Variante ist nicht eindeutig). Welches war der Punkt meiner Frage.
Tomáš Zato - Wiedereinsetzung von Monica am