最近、私はpy383でsignal I was using from flask-security was not behaving as expectedという問題が発生しました。フラスコセキュリティのソースコードを見ると、フラスコセキュリティパッケージのモジュールからインポートした信号も__init__.py
にインポートされています。パッケージのトップレベルからシグナルをインポートすることで、問題を解決することができました(パッケージが初期化されたときにシグナルがインポートされるため)。私は、次のコードを実行した場合__init__.pyと同じディレクトリからモジュールをインポートするときのPython 2.7と3.3+の違い
:
from flask.ext.security import user_registered
from flask.ext.security.signals import user_registered as user_reg_sig
user_registered==user_reg_sig
3.3+私は、Python 2.7でTrue
を得るでしょうし、私はPython用False
を取得します。
python 3.3以降では、この違いがインポート動作にどのような違いがありますか?
編集:私はまだ3.3+問題VSパイソン2.7によって困惑んだけど、flask.extの__init__.py
が呼び出されたときに問題が発生していることを絞るために管理しているとexthook.pyからExtensionImporterクラスを使用しています フラスコのセキュリティをインポートする。ここ
from flask_security.signals import user_registered as user_reg_sig
from flask_security import user_registered
user_registered==user_reg_sig
はflask.ext.securityとflask_security例については、信号用のrepr()である:
フラスコセキュリティを直接拡張フックを回避するインポートされたときにはPythonの下で、以下の3.4戻りTrue
実行
from flask_security.signals import user_registered as user_reg_sig
from flask_security import user_registered
repr(user_registered)
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>"
repr(user_reg_sig)
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>"
from flask.ext.security import user_registered
from flask.ext.security.signals import user_registered as user_reg_sig
repr(user_registered)
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>"
repr(user_reg_sig)
>>> "<blinker.base.NamedSignal object at 0x7fb38dd030b8; 'user-registered'>"
あなたがそれぞれのreprをプリントアウトすれば? –
質問内にreprを追加しました。したがって、flask.extからアクセスすると、別のオブジェクトが間違いなくあります。 – khammel
私はそれが[http://stackoverflow.com/questions/4798589/what-could-cause-a-python-module-to-be-imported-twice]とPython3.3の変更点と関係があると思います。そのエリア。これも読んでください[http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html]。 – mkiever