未来的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,它会打印 Nonefutureabsolute_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"