8

最近我遇到了一个问题,即我从烧瓶安全中使用的信号在 python 3.3 中的行为不符合预期。在查看 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

我将True使用 python 2.7,我将False使用 python 3.3+。

python 3.3+有什么不同导致导入行为的这种差异?

编辑: 我仍然被 python 2.7 vs 3.3+ 的问题难住了,但是已经设法缩小了当__init__.py调用 flask.ext 并使用exthook.py中的 ExtensionImporter 类导入 flask-security 时发生的问题。

True当直接导入flask-security时,在python 3.4下运行以下命令会返回,避免扩展挂钩:

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'>"
4

1 回答 1

0

在多种情况下,当您重新导入模块时,Python 可以决定创建对象的新实例。

事实上,这甚至不是 Python 3 特有的,它可能发生在各种场景中。

主要是你必须假设这两个对象可能不同并解决这个问题。

于 2015-09-10T17:17:39.557 回答