在__init__.py和同一目录中导入模块时,python 2.7和3.3+之间的区别

时间:2015-09-08 13:44:39

标签: python python-3.x flask python-import flask-security

最近我遇到了python 3.3中signal I was using from flask-security was not behaving as expected的问题。在查看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,并且我将获得False for python 3.3 +。

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

修改 我仍然对python 2.7 vs 3.3+问题感到困惑,但是当调用flask.ext的__init__.py并使用来自{{3}的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'>"

0 个答案:

没有答案