最近我遇到了一个问题,即在Python 3.3中,我使用的来自flask-security的信号表现不如预期。查看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
,而在Python 3.3+中,我会得到False
。在Python 3.3+中有什么不同导致了这种导入行为的差异?编辑:我仍然被Python 2.7和3.3+的问题所困扰,但已经成功缩小了范围,发现当调用flask.ext的
__init__.py
并使用exthook.py中的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'>"