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