未来的absolute_import能否清除__package__?
Can future's absolute_import clear __package__?
我有一个使用 buildout
设置的 Python 2 Pyramid 应用程序和一个使用 Mr.Developer
激活的项目文件夹;我正在尝试 futurize
这个项目作为 Python 3 迁移的一部分,它改变了:
import test
至:
from __future__ import absolute_import
from . import test
但是由于某种原因 ./bin/pserve development.ini
没有出现,它说:
...
File "/apps/src/project/engine/config.py", line 3, in <module>
import utilities
File "/apps/src/project/engine/utilities.py", line 9, in <module>
from project.engine import spreadsheets
File "/apps/src/project/engine/spreadsheets.py", line 16, in <module>
from project.engine import utilities
ImportError: cannot import name utilities
据我所知,这是一个合适的包,因为它确实有一个 setup.py
,我又 运行 develop activate project
+ buildout
。
如果我在该代码中键入 print(__package__)
,它会打印正常,但如果我添加一行 from __future__ import absolute_import
,它会打印 None
。 future
的 absolute_import
是否可以简单地清除 __package__
变量,这就是它没有将其检测为包的原因?
这是真题的MWE:Why does this circular import fail in Python 2 but not in Python 3?,好像是Python2循环导入时的bug。如果有人有干净的解决方案,请告诉我。
当 __package__
设置为 None
时,这只是 尚未设置 的标志值。没问题。
来自 PEP 366 – Main module explicit relative imports,关于 __package__
的主题:
When the import system encounters an explicit relative import in a module without __package__
set (or with it set to None
), it will calculate and store the correct value (__name__.rpartition('.')[0]
for normal modules and __name__
for package initialisation modules). If __package__
has already been set then the import system will use it in preference to recalculating the package name from the __name__
and __path__
attributes.
如果您在 主模块 中看到此设置为 None
并且它本来是包的一部分,那么请自行设置:
if __name__ == "__main__" and __package__ is None:
__package__ = "foo.bar.baz"
我有一个使用 buildout
设置的 Python 2 Pyramid 应用程序和一个使用 Mr.Developer
激活的项目文件夹;我正在尝试 futurize
这个项目作为 Python 3 迁移的一部分,它改变了:
import test
至:
from __future__ import absolute_import
from . import test
但是由于某种原因 ./bin/pserve development.ini
没有出现,它说:
...
File "/apps/src/project/engine/config.py", line 3, in <module>
import utilities
File "/apps/src/project/engine/utilities.py", line 9, in <module>
from project.engine import spreadsheets
File "/apps/src/project/engine/spreadsheets.py", line 16, in <module>
from project.engine import utilities
ImportError: cannot import name utilities
据我所知,这是一个合适的包,因为它确实有一个 setup.py
,我又 运行 develop activate project
+ buildout
。
如果我在该代码中键入 print(__package__)
,它会打印正常,但如果我添加一行 from __future__ import absolute_import
,它会打印 None
。 future
的 absolute_import
是否可以简单地清除 __package__
变量,这就是它没有将其检测为包的原因?
这是真题的MWE:Why does this circular import fail in Python 2 but not in Python 3?,好像是Python2循环导入时的bug。如果有人有干净的解决方案,请告诉我。
当 __package__
设置为 None
时,这只是 尚未设置 的标志值。没问题。
来自 PEP 366 – Main module explicit relative imports,关于 __package__
的主题:
When the import system encounters an explicit relative import in a module without
__package__
set (or with it set toNone
), it will calculate and store the correct value (__name__.rpartition('.')[0]
for normal modules and__name__
for package initialisation modules). If__package__
has already been set then the import system will use it in preference to recalculating the package name from the__name__
and__path__
attributes.
如果您在 主模块 中看到此设置为 None
并且它本来是包的一部分,那么请自行设置:
if __name__ == "__main__" and __package__ is None:
__package__ = "foo.bar.baz"