最近我遇到了一个问题,在python3.3中有一个signal I was using from flask-security was not behaving as expected。在查看flask安全性的源代码时,我注意到我从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
在Python2.7中我将得到True
,对于Python3.3+我将得到False
。在
Python3.3+中导致导入行为差异的原因是什么?在
编辑:
我仍然被python2.7vs3.3+的问题所困扰,但是我已经设法缩小了这个问题是在^{
在python 3.4下运行以下命令,当直接导入flask安全性时,返回True
,避免了扩展钩子:
这里是repr()的信号烧瓶外置安全和flask_安全示例:
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'>"
在很多情况下,Python可以决定在重新导入模块时创建对象的新实例。在
事实上,这甚至不是python3特有的,它可以在各种场景中发生。在
主要是你必须假设这两个对象可能是不同的,并解决这个问题。在
相关问题 更多 >
编程相关推荐