我有这个包裹:
mypackage/
__init__.py
a.py
b.py
我想从模块a导入到模块b的东西,在模块b中写入是否有意义
from mypackage.a import *
或者我应该使用
from a import *
两个选项都可以工作,我只是想知道哪个更好(第二个有意义,因为它处于同一级别,但我正在考虑第一个避免冲突,例如,如果系统从包含的文件夹运行一个名为a.py的文件。
答案 0 :(得分:8)
您可以安全地使用数字2,因为不应该有任何冲突 - 您将始终从与当前包相同的包中导入模块。请注意,如果您的模块与其中一个标准库模块具有相同的名称,则将导入该模块而不是标准库模块。来自the documentation:
导入名为
spam
的模块时,解释程序首先进行搜索 对于具有该名称的内置模块。如果没有找到,则搜索 对于由。给出的目录列表中名为spam.py
的文件 变量sys.path
。sys.path
已从以下位置初始化:
- 包含输入脚本(或当前目录)的目录。
- 相同
PYTHONPATH
(目录名列表,语法与- shell变量
PATH
)。- 依赖于安装的默认值。
初始化后,Python程序可以修改
sys.path
。的的 包含正在运行的脚本的目录放在开头 搜索路径,在标准库路径之前。这意味着 将加载该目录中的脚本而不是模块 库目录中的名称相同。这是一个错误,除非 打算替换。有关详细信息,请参阅Standard Modules部分 信息。
选项from mypackage.a import *
可用于整个项目的一致性原因。在某些模块中,无论如何都必须进行绝对导入。因此,您不必考虑模块是否在同一个包中,只需在整个项目中使用统一的样式。此外,这种方法更可靠,更可预测。
Python style guidelines不建议使用相对导入:
非常不鼓励进行包裹内进口的相对进口。 始终对所有导入使用绝对包路径。即便如此 PEP 328在Python 2.5中完全实现,其显式风格 积极劝阻相对进口;绝对进口更多 便携式,通常更具可读性。
自python 2.5以来,引入了intra-package relative imports的新语法。现在您可以.
引用当前模块,..
引用模块为1级以上。
from . import echo
from .. import formats
from ..filters import equalizer
答案 1 :(得分:5)
您应该使用from mypackage.a import things, you, want
。
这里有两个问题,主要是相对vs绝对导入,其语义在Python 3中已更改,并且可以选择在使用__future__
导入的Python 2.6和2.7中使用。通过使用mypackage.a,您可以保证获得实际需要的代码,并且可以在未来的Python版本上可靠地运行。
第二件事是你应该避免导入*,因为它可能会掩盖其他代码。如果a.py文件获得了一个名为sum
的函数怎么办?它会默默地覆盖内置的。在其他模块中导入自己的代码时尤其如此,因为您可能已经重用了变量或函数名称。
因此,您应该只导入所需的特定功能。在您的源代码上使用pyflakes会在您发生潜在冲突时发出警告。