Python 2.7和3.3+在同一目录中从__init__.py和模块导入时的区别

2024-04-29 12:41:21 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我遇到了一个问题,在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+的问题所困扰,但是我已经设法缩小了这个问题是在^{}的烧瓶.ext调用并使用来自exthook.py的ExtensionImporter类导入flask安全性。在

在python 3.4下运行以下命令,当直接导入flask安全性时,返回True,避免了扩展钩子:

^{pr2}$

这里是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'>"

Tags: fromimportflaskbase信号asregext
1条回答
网友
1楼 · 发布于 2024-04-29 12:41:21

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

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

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

相关问题 更多 >