8

最近、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

私はTruepython 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'>"
4

1 に答える 1

0

モジュールを再インポートするときに、Python がオブジェクトの新しいインスタンスを作成することを決定できるケースが複数あります。

実際、これは Python 3 固有のものではなく、さまざまなシナリオで発生する可能性があります。

主に、2 つのオブジェクトが異なる可能性があると想定して、これを回避する必要があります。

于 2015-09-10T17:17:39.557 に答える