【发布时间】:2011-02-03 05:54:26
【问题描述】:
我有一个包spam,其中包含一个变量_eggs in __init__.py 在同一个包中,在boiler.py 中,我有类Boiler。
在Boiler,我想在包的__init__.py文件中引用_eggs。有没有办法可以做到这一点?
【问题讨论】:
标签: python namespaces python-3.x
我有一个包spam,其中包含一个变量_eggs in __init__.py 在同一个包中,在boiler.py 中,我有类Boiler。
在Boiler,我想在包的__init__.py文件中引用_eggs。有没有办法可以做到这一点?
【问题讨论】:
标签: python namespaces python-3.x
检索该值的最合适方法是通过显式相对导入:
from . import _eggs
但是,要记住的一件事是,以下命令行调用将无法工作:
python spam/boiler.py
这不起作用的原因是解释器无法将任何直接执行的文件识别为包的一部分,因此相对导入将失败。
但是,将您当前的工作目录设置为包含“垃圾邮件”文件夹的目录,您可以改为执行该模块:
python -m spam.boiler
这为解释器提供了足够的信息来识别boiler.py 在模块层次结构中的位置并正确解析相关导入。
这仅适用于 Python 2.6 或更高版本 - 以前的版本根本无法处理来自 main 的显式相对导入。 (有关血腥细节,请参阅PEP 366)。
如果您只是从另一个文件执行 import spam.boiler,那么这应该适用于任何允许显式相对导入的 Python 版本(尽管 Python 2.5 可能需要 from __future__ import absolute_imports 才能正确启用此功能)
【讨论】:
__init__.py 中的_eggs 做到这一点,这超出了我的理解。