从同一目录导入 __init__.py 和模块时 python 2.7 和 3.3+ 之间的区别
Difference between python 2.7 and 3.3+ when importing in __init__.py and module from same directory
最近我遇到了 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
我将在 python 2.7 中获得 True
,我将在 python 3.3+ 中获得 False
。
python 3.3+ 中有什么不同导致导入行为出现这种差异?
编辑:
我仍然对 python 2.7 vs 3.3+ 问题感到困惑,但我设法缩小了当 __init__.py
of flask.ext is called and uses the ExtensionImporter class from exthook.py 导入烧瓶安全时出现问题的范围。
运行 python 3.4 returns True
直接导入flask-security 避免扩展钩子时如下:
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'>"
在多种情况下,Python 可以决定在您重新导入模块时创建对象的新实例。
事实上,这甚至不是 Python3 具体的,它可能发生在各种情况下。
主要是你必须假设这两个对象可能不同并解决这个问题。
最近我遇到了 python 3.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
我将在 python 2.7 中获得 True
,我将在 python 3.3+ 中获得 False
。
python 3.3+ 中有什么不同导致导入行为出现这种差异?
编辑:
我仍然对 python 2.7 vs 3.3+ 问题感到困惑,但我设法缩小了当 __init__.py
of flask.ext is called and uses the ExtensionImporter class from exthook.py 导入烧瓶安全时出现问题的范围。
运行 python 3.4 returns True
直接导入flask-security 避免扩展钩子时如下:
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'>"
在多种情况下,Python 可以决定在您重新导入模块时创建对象的新实例。
事实上,这甚至不是 Python3 具体的,它可能发生在各种情况下。
主要是你必须假设这两个对象可能不同并解决这个问题。