2017-06-24 2 views
-2

Ich habe knifflige Fragen. Dies sollte auch interessant sein.Python Generator Objekte: Wo werden sie gestoppt?

Es gibt eine Möglichkeit zu wissen, wo (Quelldatei und Zeilennummer) ein Generator-Objekt auf der Yield-Anweisung gestoppt wurde, warten auf Wiederaufnahme der Ausführung? Berücksichtigen Sie auch die Möglichkeit, dass ein Generator durch eine 'yield from' Anweisung an einen anderen Generator delegiert wird.

Antwort

0

Sie können immer das Attribut f_lineno des Frames des Generatorobjekts abrufen.

Jeder Generator enthält einen Verweis auf seinen Ausführungsrahmen in genobj.gi_frame. Sie können die Zeilennummer von dort Peek und finden:

genobj.gi_frame.f_lineno 

Und falls ein Generator Erträge aus einem anderen Generator, es hat ein Attribut genobj.gi_yieldfrom, den das andere Generator-Objekt enthält. Wenn gi_yieldfrom nicht None ist (was bedeutet, dass es von einem anderen Generator ergibt), schauen Sie in ihm ist gi_frame und erhalten Sie seine Zeilennummer in ähnlicher Weise.

+0

Sorry, aber aus irgendeinem Grund kann ich diesen Beitrag nicht formulieren - Danke für Ihren wertvollen Vorschlag. Dies ist meine Lösung: def generator_position (gen_obj): wenn gen_obj.gi_frame ist None: return '* beendet *' elif gen_obj.gi_yieldfrom: return generator_position (gen_obj.gi_yieldfrom) anderes: return '{}: {}'. format ( gen_obj.gi_frame.f_code.co_dateiname, gen_obj.gi_frame.f_lineno ) – Claudio