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

时间:2012-08-14 12:06:35

标签: python

我有这个包裹:

mypackage/
    __init__.py
    a.py
    b.py

我想从模块a导入到模块b的东西,在模块b中写入是否有意义

from mypackage.a import *

或者我应该使用

from a import *

两个选项都可以工作,我只是想知道哪个更好(第二个有意义,因为它处于同一级别,但我正在考虑第一个避免冲突,例如,如果系统从包含的文件夹运行一个名为a.py的文件。

2 个答案:

答案 0 :(得分:8)

您可以安全地使用数字2,因为不应该有任何冲突 - 您将始终从与当前包相同的包中导入模块。请注意,如果您的模块与其中一个标准库模块具有相同的名称,则将导入该模块而不是标准库模块。来自the documentation

  

导入名为spam的模块时,解释程序首先进行搜索   对于具有该名称的内置模块。如果没有找到,则搜索   对于由。给出的目录列表中名为spam.py的文件   变量sys.pathsys.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会在您发生潜在冲突时发出警告。