最近我遇到了python 3.3中signal I was using from flask-security was not behaving as expected的问题。在查看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
我将在python 2.7中获得True
,并且我将获得False
for python 3.3 +。
导致这种导入行为差异的python 3.3+有什么不同?
修改
我仍然对python 2.7 vs 3.3+问题感到困惑,但是当调用flask.ext的__init__.py
并使用来自{{3}的ExtensionImporter类时,我们设法缩小了问题的范围。导入flask-security。
在python 3.4下运行以下命令会在直接导入flask-security时返回True
,避免使用扩展钩:
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():
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'>"