2016-05-31 11 views
0

Scheint wie pass ist nur ein reserviertes Wort, das nicht wirklich benötigt wird. Python könnte die Konvention verwenden, eine einzige Zeile mit der Anweisung None zu haben, um dasselbe zu erreichen.Was ist der Zweck der `Pass` Aussage?

Zum Beispiel sehe ich kaum einen Unterschied zwischen

while doing_a_thing(): 
    pass 

und

while doing_a_thing(): 
    None 

Ich nehme mit pass etwas mehr lesbar ist, aber meiner Meinung nach ist es ein schlechter Kompromiss gegen das Entfernen ein solches gemeinsames Wort aus den Wahlmöglichkeiten von Funktionen/Variablen.

Ich frage mich nur, ob jemand mehr Geschichte und/oder Python-Nutzung kennt, die mir nicht bekannt ist.

+3

Es kann wohl argumentiert werden, dass das Setzen des Wertes 'None' auf einer einzelnen Zeile ist verwirrender als die Einführung einer neuen Anweisung (' pass'). –

+0

Ja, es wäre eine weitere Konvention zu lernen. Aber in Python denke ich, dass der Trend (zu Recht) darin besteht, dem Programmierer mehr Freiheit zu geben, im Austausch dafür, dass er eine angemessene Menge von Konventionen lernt und befolgt. –

+0

Nun, da wir keine Klammern haben, um leere Körper von etwas zu bezeichnen, musste eine Art No-Op-Anweisung enthalten sein. Warum "pass" und nicht irgendein anderes Wort, denke ich, dass es hauptsächlich auf Meinungen basiert. –

Antwort

7

None hat bereits Bedeutung in Python. Es ist keine Aussage, sondern a value. Es kann verwendet werden, um eine Variable zu markieren, die noch keinen Standardwert hat, oder als "Rückgabewert" einer Funktion, die nichts zurückgibt.

So wäre es verwirrender als die Verwendung des neuen Schlüsselwortes pass, es als Anweisung zu verwenden.

+0

Es ist nicht wirklich eine neue Verwendung, nur ein Ausdruck, der seinen Wert nicht spart. Sie könnten '0' oder' math.pi' oder '2 + 2' oder' "pass" 'für den gleichen Zweck verwenden. – kindall

+0

@kindall: Sie haben natürlich Recht, aber ich hatte keine Zeit, Details hinzuzufügen. ZWiki hat einige hinzugefügt, also muss ich nicht. Mein Punkt ist, dass die Verwendung eines Werts, der als Nullenerklärung * fungiert, verwirrend sein würde. Ich weiß, dass es das kann, aber in Python, ["Explizit ist besser als implizit"] (https://www.python.org/dev/peps/pep-0020/). –

4

Ich werde Rory ein bisschen hier huckepack.

None ist ein Wert, während pass eine Aussage ist.

Zum Beispiel, wenn Sie einen Standardwert für eine Funktion wünschen würden Sie

tun
def my_func(val1, val2=None): 
    # Some stuff here 

Wo None verwendet wird, um anzuzeigen, dass der Standardwert von val2 Keine ist.

Wenn Sie eine Klasse haben, jedoch können Sie pass auf diese Weise sehen:

class MyClass(object): 
    def __init__(self): 
     pass 

Wo pass kann es sein, weil Sie später die __init__ Methode definieren möchten, oder um anzuzeigen, dass es tut nichts für die Klasse.

Wie auch immer, pass ist zu sagen, "Ich könnte hier etwas tun, aber ich bevorzuge es nicht". Und None ist ein Ist-Wert, die Sie explizit zu sagen bedeutet „Ja, ich gebe diesen Wert None

EDIT:.
Ich verstehe mehr von der Verwirrung jetzt

Da sehen Sie, dass:

class MyClass(object): 
    def __init__(self): 
     pass 

als

geschrieben werden konnte
class MyClass(object): 
    def __init__(self): 
     None 

Dies ist nicht Pythons Art zu sagen, dass None entspricht pass hier. Es wird einfach gesagt, dass die Bereitstellung nur eines value als No-Op, den gleichen Effekt haben wird.Das heißt also, dass ich auch tun:

class MyClass(object): 
    def __init__(self): 
     12 

Und dies natürlich nicht sinnvoll ist, warum sollten Sie jemals 12 dort setzen? Der Punkt hier ist, dass die Effekte die gleichen sind, aber die Bedeutungen sind in diesem Fall unterschiedlich. Und in vielen Fällen None und pass sind nicht austauschbar wie Standardargumente

+0

Guter Fang. Ich meinte Aussage, aber denke immer daran als Platzhalter für mich selbst. – ZWiki

+0

Mein Punkt ist, dass Sie in Ihrem Beispiel 'pass' durch' None' ersetzen könnten und der Code würde sich genau so verhalten. –

+0

@PeteCacioppi, ja, aber ich könnte "pass" durch "None" oder einen anderen Wert wie "12" ersetzen. Es ist nicht so, dass 'None' gleichbedeutend ist mit 'pass' hier, sondern dass Sie einen' Wert' unter 'init' setzen können und es wird nichts tun. – ZWiki