何时使用绝对导入 [英] When to use absolute imports

查看:87
本文介绍了何时使用绝对导入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在改变一堆旧的python代码,偶尔会遇到包之间的名称冲突。我有一个关于何时应该使用绝对导入以及是否适合仅按名称导入同级模块的问题。

  / package / 
/package/__init__.py
/ package / subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/ package / subB
/package/subB/__init__.py
/package/subB/moduleA.py
/ package / subB / moduleB .py

包中的每个import语句都应如下所示:

  import package.subX.moduleX 

或者来自package.subX导入模块X

b
$ b

在子包 __ init __。py 文件中怎么办?简单地放

  import moduleA 
import moduleB

或者,在/package/subA/moduleA.py中,简单地放一下是不对的:

  import moduleB 


解决方案

相对导入结果是一个非常糟糕的主意,即使它们是长期的默认行为。你可以在这个网站上找到很多问题,有人只是在内置模块之后命名他们的文件并用奇怪的错误信息打破他们的应用程序。



这就是为什么通过引用你的项目到处(包括包)来进行绝对导入总是好的。



简而言之,请使用以下样式:

 从myproject.mypackage导入myproject.mypackage 
。 myfile import MyClass

引自 PEP8


包裹内进口的相对进口高度为
灰心。
始终对所有导入使用绝对包路径。
即使现在 PEP 328 在Python 2.5中完全实现,
积极劝阻明确相对进口的风格;
绝对导入更便携,通常更易读。



I'm changing a bunch of old python code that is occasionally running into name collisions between packages. I have a question about when absolute imports should be used and whether it would be proper to import same-level modules by name only.

/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py

Should every import statement within the package look like:

import package.subX.moduleX

or

from package.subX import moduleX

What about in the subpackage __init__.py files. Would it be wrong to simply put

import moduleA
import moduleB

Or, in /package/subA/moduleA.py, would it be wrong to simply put:

import moduleB

解决方案

Relative imports turned out to be a very bad idea, even though they were the default behavior for long. You can find quite a few questions on this site where someone simply named their file after a builtin module and broke their application with weird error messages.

That's why it's always a good to do absolute imports by referencing your project everywhere, including packages.

In short, use this style:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass

Quote from PEP8:

Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that PEP 328 is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.

这篇关于何时使用绝对导入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆