繁体   English   中英

python - 同一目录中模块的绝对导入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM