Folgendes berücksichtigen:
def some_function():
return 1
def some_generator():
yield 1
Im obigen Code some_function
ist eine Funktion, während some_generator
es sich um einen Generator handelt. Sie sehen ziemlich ähnlich aus.
Das Problem beim Lesen von Code ist, dass ich jede Zeile in einer "Funktion" nach dem yield
Schlüsselwort durchsuchen muss, bevor ich feststellen kann, ob es sich tatsächlich um eine Funktion oder einen Generator handelt!
Es scheint mir nur, dass die Verwendung eines anderen Schlüsselworts für Generatoren sinnvoller wäre, z.
gen some_generator():
yield 1
Was sind die Vorteile der Verwendung des def
Schlüsselworts für Generatoren und Funktionen? Warum wurde kein neues Schlüsselwort eingeführt, um Funktionen und Generatoren zu trennen?
design
programming-languages
python
Derek Kwok
quelle
quelle
gen
anstelle von zu verwenden,def
würde diese Transformation nicht wesentlich belastender machen.Antworten:
"Was sind die Vorteile der Verwendung des Schlüsselworts def für Generatoren und Funktionen?"
Während sie sich mechanisch unterscheiden, sind sie in der Praxis, wenn ich sie benutze, für mich konzeptionell oft gleich (ich denke nicht viel darüber nach,
range()
vs zu nennenxrange()
).Um schnell zu verstehen, worum es bei der Funktion geht, stimme ich zu, dass bei der Verwendung von etwas verloren geht
def
, aber die Dinge sollten innerhalb der Funktion zunächst nicht zu verschleiert sein.Sogar ein Impliziter
return None
kann das beabsichtigte Verhalten einer Funktion nach einer langen Reihe von Bedingungen verwirren (wie in, war einreturn None
beabsichtigtes Verhalten oder ein Versehen in der Logik). Aber das sind nur meine Überzeugungen darüber.Ich glaube nicht, dass meine Argumentation besonders überzeugend ist, deshalb werde ich mich nur PEP 255 zuwenden :
quelle
await
(undasync with
undasync for
) Syntaxkonstrukte , die sehr ähnlichyield from
funktionieren, die Deklaration der Funktion, in der sie verwendet werden,async def
anstelle von just erforderlich istdef
.Durch das Hinzufügen neuer Schlüsselwörter besteht die Gefahr, dass vorhandene Programme beschädigt werden. Sprachdesigner versuchen im Allgemeinen, das Hinzufügen neuer Schlüsselwörter zu vermeiden, insbesondere bei Sprachfunktionen, die hinzugefügt werden, nachdem die Sprache bereits an Popularität gewonnen hat. Jedes hinzugefügte Schlüsselwort ist eine Kennung, die Programme nicht für andere Zwecke verwenden dürfen. Das Hinzufügen eines Schlüsselworts kann daher möglicherweise vorhandene Programme beschädigen. Sprachdesigner müssen die Vorteile eines neuen Keywords gegen die Kosten abwägen.
Ich bezweifle, dass das Definieren eines separaten Schlüsselworts für Generatoren von großem Nutzen wäre. Zu verstehen, ob ein Symbol dem Namen einer Funktion oder dem Namen eines Generators entspricht, ist für Anrufer wichtig, und Anrufer sollten nicht (und manchmal auch nicht) prüfen müssen, welches Schlüsselwort zur Implementierung verwendet wurde. Dies liegt in der Verantwortung besserer Namenskonventionen und Dokumentationen.
quelle
Generatoren sind Funktionen, die träge auswerten. Da sie an der Basis dasselbe sind, ist es sinnvoll, dass sie dasselbe Schlüsselwort verwenden. Eine Möglichkeit könnte darin bestehen, einen Kommentar zu verwenden, um zu identifizieren, welcher für eine bestimmte Instanz welcher ist:
quelle
Ich würde vermuten, dass es mehr pythonisch ist, aber was weiß ich? ;)
Ich denke nicht wirklich, dass es so wichtig ist. Es fällt mir leichter, mich zu erinnern, weil ich mir beide nicht merken muss.
EDIT: Der PEP könnte sagen, Sie könnten dort untersuchen.
quelle