最近我遇到了一个问题,在python3.3中有一个我从烧瓶上发出的信号-保安没有像预期的那样行事。。在查看烧瓶安全的源代码时,我注意到我从烧瓶安全包中的一个模块导入的信号也是在__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,并为python 3.3+获取False。
导致导入行为差异的python 3.3+有什么不同?
编辑:I仍然被python2.7vs 3.3+问题困扰,但它缩小了在调用__init__.py of flask.ext并使用exthook.py中的ExtensionImporter类导入烧瓶安全性时出现的问题。
在python3.4下运行以下命令,在直接导入烧瓶安全性时返回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'>"发布于 2015-09-10 17:17:39
在多种情况下,Python可以在重新导入模块时决定创建对象的新实例。
事实上,这甚至不是Python 3所特有的,它可以发生在不同的场景中。
主要是,您必须假设这两个对象可能是不同的,并围绕这一点进行工作。
https://stackoverflow.com/questions/32459482
复制相似问题