最近、flask-security から使用していたシグナルがPython 3.3 で期待どおりに動作しないという問題がありました。Flask-security のソース コードを調べたところ、flask-security パッケージのモジュールからインポートしていたシグナルが にもインポートされていることに気付きました__init__.py
。パッケージの最上位レベルから信号をインポートすることで、問題を解決できました (パッケージの初期化時に信号がインポートされるため)。
次のコードを実行すると:
from flask.ext.security import user_registered
from flask.ext.security.signals import user_registered as user_reg_sig
user_registered==user_reg_sig
私はTrue
python 2.7を取得False
し、python 3.3+を取得します。
このインポート動作の違いを引き起こす python 3.3+ の違いは何ですか?
編集:
私はまだpython 2.7対3.3+の問題に困惑していますが、flask.extが呼び出され、exthook.pyのExtensionImporterクラスを使用してflask-securityをインポートするときに問題が発生していることを絞り込むことができまし__init__.py
た。
python 3.4 で以下を実行するとTrue
、flask-security が拡張フックを回避して直接インポートされたときに返されます。
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 およびフラスコ_セキュリティの例のシグナルの repr() を示します。
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'>"