2012-08-14 63 views
12

我有这个包:蟒蛇 - 在同一个目录的绝对进口的模块

mypackage/ 
    __init__.py 
    a.py 
    b.py 

我想从模块导入的事情模块B,是否有意义模块写b

from mypackage.a import * 

,或者我应该只使用

from a import * 

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

回答

6

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

当导入一个名为spam模块,解释器首先搜索 与该名称的内置模块。如果找不到,则它在 变量sys.path给出的目录列表中搜索 以获得名为spam.py的文件。 sys.path从这些位置初始化:

  • 包含输入脚本(或当前目录)的目录。
  • PYTHONPATH(目录名称列表,其语法与
  • shell变量PATH相同)。
  • 安装依赖的默认值。

初始化后,Python程序可以修改sys.path包含正在运行的脚本的 目录放置在搜索路径的开头 之前,位于标准库路径之前。这意味着 该目录中的脚本将被加载,而不是在库目录中具有相同名称的 模块。这是一个错误,除非打算更换 。有关更多 信息,请参见部分Standard Modules

选项from mypackage.a import *可用于整个项目的一致性原因。在某些模块中,无论如何您都必须进行绝对导入。因此,您不必考虑模块是否在同一个软件包中,只需在整个项目中使用统一的样式。此外,这种方法更可靠和可预测。

Python style guidelines不推荐使用相对导入:

的封装内进口相对进口高度气馁。 始终对所有导入使用绝对包路径。即使现在,在Python 2.5中完全实现了 PEP 328,但其相对导入的显式 风格受到阻碍;绝对进口更便携,通常更具可读性。

由于python 2.5引入了intra-package relative imports的新语法。现在您可以参考.来查看当前模块,并且参考模块上面的1个级别来参考..

from . import echo 
from .. import formats 
from ..filters import equalizer 
+3

你怎么知道无论真的是不是与内建的碰撞?由于某种原因隐含的相对进口被杀害,它们并不安全。 – MatthewWilkes 2012-08-14 13:56:58

+0

你是对的,一个内置模块将被我们自己拥有的相同名称所掩盖。 – 2012-08-14 14:25:14

+0

“Python风格指南不建议采用第一种方法:” 对我来说,看起来他们确实推荐第一个 “对所有导入始终使用绝对包路径” – banana 2012-08-15 15:37:49

5

您应该使用from mypackage.a import things, you, want

这里有两个问题,主要是相对vs绝对导入,其语义在Python 3中进行了更改,并且可以选择在Python 2.6和2.7中使用,使用导入__future__。通过使用mypackage.a,您可以保证您将获得您真正想要的代码,并且可以在将来的Python版本上可靠地工作。

第二件事是你应该避免导入*,因为它可能会掩盖其他代码。如果a.py文件获得了一个名为sum的函数,该怎么办?它会默默地覆盖内置的一个。在其他模块中导入自己的代码时,这是非常糟糕的,因为您可能已经重用了变量或函数名称。

因此,您应该只导入您需要的特定功能。如果在源代码中使用pyflakes,则会在发生潜在冲突时发出警告。

+2

+1。顺便说一句,'从__future__ import absolute_import'也适用于python 2.5。 – jfs 2012-08-15 19:12:05