Unterschied zwischen python 2.7 und 3.3+ beim Importieren in __init__.py und Modul aus demselben Verzeichnis

8

Kürzlich hatte ich ein Problem, bei dem ein Signal, das ich von Flasch-Security verwendet habe, verhält sich nicht wie erwartet in Python 3.3. Bei der Betrachtung des Quellcodes für die Flasch-Sicherheit habe ich festgestellt, dass das Signal, das ich von einem Modul in das Paket-Sicherheitspaket importierte, auch in __init__.py importiert wurde. Durch das Importieren des Signals von der obersten Ebene des Pakets konnte ich mein Problem lösen (da das Signal importiert wird, wenn das Paket initialisiert wird).

Wenn ich den folgenden Code ausführen:

%Vor%

Ich bekomme True in Python 2.7 und ich bekomme False für python 3.3 +.

Was ist anders in Python 3.3+, das diesen Unterschied im Importverhalten verursacht?

BEARBEITEN: Ich bin immer noch von der Python 2.7 vs 3.3 + Problem, aber haben es geschafft, einzugrenzen, dass das Problem auftritt, wenn die __init__.py von flask.ext wird aufgerufen und verwendet die ExtensionImporter-Klasse von exhook.py , um die Flasch-Sicherheit zu importieren.

Wenn Sie unter python 3.4 Folgendes ausführen, wird True zurückgegeben, wenn die flask-security direkt importiert wird und der Erweiterungs-Hook vermieden wird:

%Vor%

Hier ist repr () für Signale für flask.ext.security und flask_security Beispiele:

%Vor%     
khammel 08.09.2015, 13:44
quelle

1 Antwort

0

Es gibt mehrere Fälle, in denen Python entscheiden kann, eine neue Instanz eines Objekts zu erstellen, wenn Sie das Modul erneut importieren.

Tatsächlich ist Python 3 nicht spezifisch und kann in verschiedenen Szenarien vorkommen.

Hauptsächlich müssen Sie davon ausgehen, dass die beiden Objekte unterschiedlich sein können und umgehen.

    
sorin 10.09.2015, 17:17
quelle