Was Sie tun, ist so idiomatisch wie es sein kann. Einige Sprachen haben einen binären Präfix-Operator namens do
, die ihr Argument aufruft:
generator = do <generator expression>
Python Syntax funktioniert einfach nicht zulassen, dass Sie mehrzeilige Funktionen als Ausdrücke schreiben. Sie müssen def
Anweisungen verwenden. Deshalb sollten Sie nicht eine mehrzeilige Funktion oder Generator Dekorateur mit einem normalen Aufruf in Python entweder passieren können:
generator = decorator(def generator(): yield) # syntax error
Sie haben die Funktion zu definieren oder Front Generator:
def generator(): yield
generator = decorator(generator)
Es ist vor allem Diese syntaktische Einschränkung, die Python gezwungen hat, die @
-Syntax für Dekorationsfunktionen zu übernehmen, die mit einer def
-Anweisung definiert sind. Der folgende Code entspricht dem letzten Beispiel (abgesehen von einem feinen Unterschied in wenn die Namen zugeordnet sind):
@decorator
def generator(): yield
Als Greg erwähnt, gibt Generator Comprehensions sind, die wirklich gut funktionieren, wo sie nutzen zu können , aber wenn du mehr Logik im Körper brauchst, dann scheint das, was du machst, der pythischste Weg zu sein. Es ist nur so, dass die Python-Syntax die funktionale Programmierung immer ziemlich klobig gemacht hat.
Sie gebeten, in den Kommentaren zu den Sprachen, die die do
Betreiber haben. CoffeeScript und Haskell haben es beide.Um ehrlich zu sein, verstehe ich nicht wirklich anything the Haskell docs say, aber in CoffeeScript, do
ist nützlich für das Erstellen von Werten innerhalb von Schließungen.
Werfen Sie einen Blick auf diesen Code (es folgt eine Erklärung).
updateElementText = do ->
element = jQuery "#someElement"
return (newText) -> element.text newText
, die wie folgt in JS aussehen:
let updateElementText = function() {
let element = jQuery("#someElement");
return function(newText) { element.text(newText) };
}(); // Immediately-Invoked Function Expression (IIFE)
Der Code updateElementText
zur Funktion zuweist, die auf der Linie 3, die von der Schließung element
verweist zurückgegeben. Das Element wird nur einmal (in Zeile 2) von jQuery ausgewählt, unabhängig davon, wie oft updateElementText
aufgerufen wird, um das Element zu aktualisieren. Beachten Sie auch, dass element
ausgeblendet ist, sodass nur von der Funktion, die es aktualisiert, referenziert werden kann.
Gibt es irgendeinen Grund/Grund * nicht *? Mit solch einem einfachen Beispiel könnte man es wahrscheinlich mit 'itertools' und nicht mit einer Funktion machen. – jonrsharpe
Ja. Ich habe versucht, in meinem letzten Absatz klarzustellen, dass dies alles zu stark vereinfacht ist ... Ich nehme an, ich möchte komplexe Dinge in der Definition von "Mygenerator" machen. Und vermeiden Sie, dass zwei Instanzen erstellt werden. – NichtJens
@azrael: Wenn Sie möchten, dass diese "komplexen Dinge" zur Definitionszeit passieren, wird das, wonach Sie fragen, diesen Effekt nicht haben. Keiner der Körper der Generatorfunktion wird bis zum ersten "nächsten" ausgeführt. Wenn Sie zwei Iteratoren vermeiden möchten, sollten Sie nicht zwei Iteratoren erstellen, statt die Funktion durch ihren Rückgabewert zu ersetzen. – user2357112