2010-01-14 8 views
15

ich immer gefragt, warum wir keine Bindestriche zwischen Funktionsnamen und Variablennamen in PythonWarum Python erlaubt keine Bindestriche

versucht, mit funktionellen Programmiersprachen wie Lisp und Clojure verwenden, wo Bindestriche sind zulässig. Warum Python das nicht macht.

# This won't work -- SyntaxError 
def is-even(num): 
    return num % 2 

# This will work 
def is_even(num): 
    return num % 2 

Ich bin sicher, Sir Guido muss das aus irgendwelchen Gründen getan haben. Ich googelte, konnte aber die Antwort nicht finden. Kann jemand bitte etwas Licht darauf werfen?

+0

Dieser Syntaxfehler tritt auf, weil "is" ein Schlüsselwort ist. In 'def mainbe-even (num)' würde der Syntaxfehler wegen des Bindestrichs liegen. – balpha

+0

Ich habe mich immer gefragt, warum ASCII "-" und "_" hat. Während Sie sich über die Verwendung von "-" wundern, könnten Sie sich auch über die Verwendung von "_" wundern? Tatsächlich habe ich viele Interpunktionsfragen, die genauso wichtig sind wie diese. Warum unterscheiden sich "#" und "♯"? Kannst du dich darüber auch wundern? Ich fand es immer merkwürdig, dass wir "♯" nicht für Kommentare verwenden können. –

+0

(@aatifh, siehe http://meta.stackexchange.com/questions/35582/inaccurate-revision-information - Hast du den Tag von 'pyhon' in' python' geändert? Und vielleicht auch einen nachträglichen Backtick entfernt der Titel?) – Arjan

Antwort

35

Da Bindestrich als Subtraktionsoperator verwendet wird. Stellen Sie sich vor, dass Sie könnte haben eine is-even Funktion, und dann hatten Sie Code wie folgt:

my_var = is-even(another_var) 

Ist is-even(another_var) ein Aufruf der Funktion is-even, oder ist es das Ergebnis der Funktion even aus einer Variablen Subtrahieren namens is ?

Lisp Dialekte haben dieses Problem nicht, da sie Präfixnotation verwenden. Zum Beispiel gibt es deutliche Unterschiede zwischen

(is-even 4) 

und

(- is (even 4)) 

in Lisps.

+8

In Bezug auf Lisp ist das Präfix Aspekt irrelevant; der Unterschied besteht vielmehr darin, dass "-" nicht notwendigerweise als separates Token betrachtet wird; Jede Kombination von Buchstaben und "normaler" Interpunktion (z. B. nicht ")") kann einen einzelnen Token bilden. Eine Infix-Sprache könnte mit solchen Regeln perfekt funktionieren; dann wäre "is-even (another_var)" ein Funktionsaufruf und "is - even (another_var)" wäre die Subtraktion, genau wie in Lisps (is - even 4) ein anderer s-Ausdruck ist von '(is-even 4)'. –

+0

Lisp hat dieses Problem nicht, weil "-" nur ein Zeichen ist. –

+0

Ich kann sehen, dass '-' für den Minus-Operator verwendet werden sollte und dass die Infix-Notation für die Lesbarkeit gut ist (für diejenigen, die nicht mit Präfixnotationsrechnern aufgewachsen sind). Gibt es jedoch einen zwingenden Grund, das Fehlen von Leerzeichen um die Minuszeichen und andere Operatoren zuzulassen? Da Whitespace bereits in Python wichtig ist, erzwingen Sie die Verwendung von Whitespaces um Operatoren, die die Verwendung von Bindestrichen in Namen ermöglichen würden, was meiner Meinung nach eine viel lesbarere und leichter zu klassifizierende Konvention ist als sowohl unter_score als auch camelWTFFCase nicht mögen in gleichen Mengen. –

7

Weil es den Parser noch komplizierter machen würde. Es wäre auch für die Programmierer verwirrend.

Betrachten def is-even(num):: jetzt, wenn is eine globale Variable ist, was passiert?

Beachten Sie auch, dass der - ist der Subtraktionsoperator in Python, würde daher weiter Parsing erschweren.

0
is-even(num) 

enthält einen Bindestrich? Ich dachte, es wäre eine Subtraktion des Wertes, der von der Funktion selbst mit dem Argument num aus dem Wert von is zurückgegeben wird.

Wie @jdupont sagt, kann Parsing schwierig sein.

Mark

+0

'is' ist ein Schlüsselwort, es kann keinen Wert haben :) – balpha

+1

Parsen kann schwierig sein. Das Subtrahieren eines Werts von einem Schlüsselwort führt dazu, dass der Parser sich beschweren kann. –

9

Da Python Infixschreibweise verwendet Berechnungen und einen Bindestrich und ein minus den exakt gleichen ASCII-Code zu vertreten hat. Sie können mehrdeutige Fälle haben wie:

a-b = 10 
a = 1 
b = 1 

c = a-b 

Was ist die Antwort? 0 oder 10?

+0

Ich habe dieses eine. Es scheint sehr geradlinig zu sein. Jede Sprache mit einer Infix-Notation kann keine Bindestriche verwenden. Bindestriche sind nur in der Sprache zulässig, die S-Ausdruck unterstützt. :) – aatifh

+1

Nun, eine Programmiersprache, deren eigener Zeichensatz Unicode ist (sie kommen), könnte leicht zwischen einem Bindestrich und einem Minuszeichen unterscheiden. Das Problem ist, dass zu viele Sprachen in ihren Zeichensätzen nicht zwischen Bindestrichen und Minuszeichen unterscheiden können. Es ist die Armut des Charakters, nicht die Armut der Expressivität. –

+0

Sie haben Recht, obwohl diese Fähigkeit böse wäre, wenn jemand sie ausnutzen würde und sie in ihren Identifikatoren verwenden würde. – JPvdMerwe

Verwandte Themen