我有这个包:
mypackage/
__init__.py
a.py
b.py
我想从a模块导入东西到b模块,写在b模块里面有意义吗?
from mypackage.a import *
还是我应该只使用
from a import *
这两个选项都可以正常工作,我只是想知道哪个更好(第二个选项因为它在同一级别所以很合理,但我正在考虑第一个选项以避免冲突,例如如果系统正在运行包含文件a.py的文件夹中)。
我有这个包:
mypackage/
__init__.py
a.py
b.py
我想从a模块导入东西到b模块,写在b模块里面有意义吗?
from mypackage.a import *
还是我应该只使用
from a import *
这两个选项都可以正常工作,我只是想知道哪个更好(第二个选项因为它在同一级别所以很合理,但我正在考虑第一个选项以避免冲突,例如如果系统正在运行包含文件a.py的文件夹中)。
spam
的模块时,解释器首先搜索具有该名称的内置模块。如果找不到,则在变量sys.path
给出的目录列表中搜索名为spam.py
的文件。sys.path
从以下位置初始化:PYTHONPATH
(目录名称列表,与shell变量PATH
具有相同的语法)。
- 安装相关的默认值。sys.path
。正在运行的脚本所在的目录被放置在搜索路径的开头,位于标准库路径之前。这意味着该目录中的脚本将被加载,而不是库目录中同名的模块。除非有意替换,否则这是一个错误。有关更多信息,请参见标准模块部分。from mypackage.a import *
可以在整个项目中用于一致性的原因。在某些模块中,您仍然需要进行绝对导入。因此,您无需考虑模块是否在同一个包中,只需在整个项目中使用统一的样式即可。此外,这种方法更加可靠和可预测。
Python风格指南不建议使用相对导入:
自从Python 2.5以来,包内相对导入的新语法被引入。现在你可以使用强烈不建议使用相对导入进行包内导入。 对于所有导入,请始终使用绝对包路径。即使现在 PEP 328 在Python 2.5中已完全实现,其显式的 相对导入风格仍然被强烈反对;绝对导入更具 可移植性和可读性。
.
来引用当前模块,..
来引用上一级模块。请注意保留HTML标签。from . import echo
from .. import formats
from ..filters import equalizer
from mypackage.a import things, you, want
。__future__
导入。通过使用 mypackage.a,您保证将获得您实际想要的代码,并且它将可靠地在未来的 Python 版本上工作。sum
的函数,它将悄悄地覆盖内置函数。当在其他模块中导入您自己的代码时,这尤其糟糕,因为您可能已经重用了变量或函数名称。from __future__ import absolute_import
在 Python 2.5 上也可以使用。 - jfs