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

ban*_*ana 14 python

我有这个包裹:

mypackage/
    __init__.py
    a.py
    b.py
Run Code Online (Sandbox Code Playgroud)

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

from mypackage.a import *
Run Code Online (Sandbox Code Playgroud)

或者我应该使用

from a import *
Run Code Online (Sandbox Code Playgroud)

这两个选项都可以工作,我只是想知道这是更好的(第二有道理的,因为它是在同一水平线上,但我考虑的第一个以避免冲突,例如,如果系统是从包含名为文件的文件夹运行a.py).

Mak*_*zin 8

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

spam导入命名模块时,解释器首先搜索具有该名称的内置模块.如果未找到,则会搜索spam.py由变量给出的目录列表中指定的文件sys.path.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
Run Code Online (Sandbox Code Playgroud)

  • 而且你怎么知道'a'到底是什么意思不是与内置的碰撞?由于某种原因,隐性相对进口被杀,他们并不安全. (3认同)

Mat*_*kes 5

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

这里有两个问题,主要是相对vs绝对导入,其语义在Python 3中有所改变,并且可以选择在使用__future__导入的Python 2.6和2.7中使用.通过使用mypackage.a,您可以保证获得实际需要的代码,并且可以在未来的Python版本上可靠地运行.

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

因此,您应该只导入所需的特定功能.在您的源代码上使用pyflakes将在您有潜在冲突时发出警告.

  • +1.顺便说一句,`from __future__ import absolute_import`也适用于python 2.5. (2认同)