Wie überprüfe ich in Python, ob ein Objekt ein Generatorobjekt ist?
Ich versuche das -
>>> type(myobject, generator)
gibt den Fehler -
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(Ich weiß, ich kann überprüfen, ob das Objekt eine hat next
Methode hat, um ein Generator zu sein, aber ich möchte eine Möglichkeit, mit der ich den Typ eines Objekts bestimmen kann, nicht nur Generatoren.)
from types import GeneratorType;type(myobject, GeneratorType)
gibt Ihnen das richtige Ergebnis für Objekte der Klasse 'generator'. Aber wie Daenyth andeutet, ist das nicht unbedingt der richtige Weg.__next__
, akzeptieren Sie tatsächlich jeden Iterator, nicht nur Generatoren - was sehr wahrscheinlich das ist, was Sie wollen.Antworten:
Sie können GeneratorType aus folgenden Typen verwenden:
quelle
isinstance(gen, (types.GeneratorType, map, filter))
ist es auch nützlich,map
und zu erkennenfilter
. Dies schließt jedoch andere Iterables und Iteratoren nicht ein.Du meinst Generatorfunktionen? verwenden
inspect.isgeneratorfunction
.EDIT:
Wenn Sie ein Generatorobjekt möchten, können Sie inspect.isgenerator verwenden, wie von JAB in seinem Kommentar hervorgehoben.
quelle
inspect.isgenerator
.inspect.isgenerator
nur eine Abkürzung für: istisinstance(object, types.GeneratorType)
.Ich denke, es ist wichtig, zwischen Generatorfunktionen und Generatoren zu unterscheiden (Ergebnis der Generatorfunktion):
Der Aufruf von generator_function liefert kein normales Ergebnis, führt sogar keinen Code in der Funktion selbst aus. Das Ergebnis ist ein spezielles Objekt namens generator :
Es handelt sich also nicht um eine Generatorfunktion, sondern um einen Generator:
und Generatorfunktion ist nicht Generator:
Nur als Referenz wird der tatsächliche Aufruf des Funktionskörpers durch den Verbrauch eines Generators erfolgen, z.
Siehe auch In Python gibt es eine Möglichkeit zu überprüfen, ob eine Funktion eine "Generatorfunktion" ist, bevor sie aufgerufen wird?
quelle
Die
inspect.isgenerator
Funktion ist in Ordnung, wenn Sie nach reinen Generatoren suchen möchten (dh nach Objekten der Klasse "Generator"). Es wird jedoch zurückgegeben,False
wenn Sie beispielsweise einizip
iterables Element überprüfen . Eine alternative Möglichkeit zur Suche nach einem verallgemeinerten Generator ist die Verwendung dieser Funktion:quelle
x=iter([1,2])
. Mir scheint, es wird wirklich getestet, ob ein Objekt ein Iterator und kein Generator ist. Aber vielleicht ist "Iterator" genau das, was Sie unter "generalisiertem Generator" verstehen.quelle
Tu das nicht. Es ist einfach eine sehr, sehr schlechte Idee.
Tun Sie stattdessen Folgendes:
Für den unwahrscheinlichen Fall, dass der Hauptteil der for- Schleife auch
TypeError
s enthält, gibt es mehrere Möglichkeiten: (1) Definieren Sie eine Funktion, um den Umfang der Fehler zu begrenzen, oder (2) verwenden Sie einen verschachtelten try- Block.Oder (3) so etwas, um all diese
TypeError
s zu unterscheiden, die herumschweben.Oder (4) die anderen Teile Ihrer Anwendung reparieren, um Generatoren entsprechend bereitzustellen. Das ist oft einfacher als das alles.
quelle
if
Aussagen. Und. Diese Art der Mikrooptimierung ist Zeitverschwendung. Korrigieren Sie den Algorithmus, der eine gemischte Tüte von Iteratoren und Nicht-Iteratoren erzeugt, um nur Iteratoren zu erzeugen und sich all diesen Schmerz zu ersparen.Sie können den Iterator oder genauer gesagt den Generator aus dem Typisierungsmodul verwenden .
Ergebnis:
quelle
typing.TypeVar
scheinen die Dokumente für die Klasse von der Verwendungisinstance
in Verbindung mit demtyping
Modul abzuraten : "isinstance(x, T)
Wird zur Laufzeit ausgelöstTypeError
. Im Allgemeinenisinstance()
undissubclass()
sollte nicht mit Typen verwendet werden."Wenn Sie einen Tornado-Webserver oder einen ähnlichen verwenden, haben Sie möglicherweise festgestellt, dass Servermethoden tatsächlich Generatoren und keine Methoden sind. Dies macht es schwierig, andere Methoden aufzurufen, da Yield innerhalb der Methode nicht funktioniert und Sie daher mit der Verwaltung von Pools verketteter Generatorobjekte beginnen müssen. Eine einfache Methode zum Verwalten von Pools verketteter Generatoren besteht darin, eine Hilfefunktion wie z
Schreiben Sie jetzt verkettete Generatoren wie
Erzeugt Ausgabe
Welches ist wahrscheinlich, was Sie wollen, wenn Sie Generatoren als Thread-Alternative oder ähnliches verwenden möchten.
quelle
(Ich weiß, dass es ein alter Beitrag ist.) Es ist nicht erforderlich, ein Modul zu importieren. Sie können zu Beginn des Programms ein Objekt zum Vergleich deklarieren:
quelle