2015-09-08 8 views
8

最近、私は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'>" 
+0

あなたがそれぞれのreprをプリントアウトすれば? –

+0

質問内にreprを追加しました。したがって、flask.extからアクセスすると、別のオブジェクトが間違いなくあります。 – khammel

+0

私はそれが[http://stackoverflow.com/questions/4798589/what-c​​ould-cause-a-python-module-to-be-imported-twice]とPython3.3の変更点と関係があると思います。そのエリア。これも読んでください[http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html]。 – mkiever

答えて

0

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

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

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

+0

ありがとうございます。 Flaskによるシグナルの使用に問題があり、フラスコでの輸入が行われたときに何が起こるかのようです。*。* – khammel

関連する問題