【问题标题】:Clean imports from packages in Python从 Python 中的包中清除导入
【发布时间】:2013-03-20 03:57:08
【问题描述】:

我有以下项目结构:

project
|----app.py
|----package
     |---__init__.py
     |---module.py
     |---module2.py
     |---module3.py
     |---....

我的__init__.py 文件目前是空的。在 module.py 我有一个类的定义:

class UsefulClass:
    ...

在其他模块中也有类似的定义。我的 app.py 看起来像这样:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from package.module import UsefulClass
from package.module2 import UsefulClass2
...

usefulclass = UsefulClass()
usefulclass2 = UsefulClass2()
....

我的问题是:如何替换这个 from package.module... import UsefulClass 语句?即使是现在,我也只定义了 4 个模块,而且这个导入开始看起来很丑陋。我可以将它们导入__init__.py 文件然后在app.py 中使用import package 吗?我已经尝试过了,它给了我一个错误。

我正在寻找一个干净优雅的解决方案。

【问题讨论】:

  • 你用的是什么版本的 Python?
  • 另外,请告诉我们您尝试了什么,以及您遇到了什么错误(带有回溯)。
  • project.package.__init__.py中:导入子包并使用__all__ = [...]docs.python.org/2/tutorial/…
  • 我使用的是 Python 3.3

标签: python import module python-3.x package


【解决方案1】:

在 Python 3 中:

package/__init__.py:

from .foo import bar

package/foo.py:

bar=0

app1.py:

import package
print(package.bar)

app2.py:

from package import bar
print(bar)

无论哪种方式,这都会打印0,就像你想要的那样。

在 Python 2 中,只需将 from .foo import bar 更改为 from foo import bar

(实际上,2.x 的代码在 Python 3 中经常可以工作,但并不正确,在某些边缘情况下会失败。例如,如果您有一个与应用程序同级的bar.py,你最终会得到 bar 是那个模块,而不是 0。)

在现实生活中,您可能希望从每个包和模块中指定一个__all__,您可能曾经from foo import …(如果没有其他原因,只是允许使用from foo import * 在交互式解释器中测试事物)。

听起来您是在说您已经尝试过了,但遇到了错误。在不知道确切你尝试了什么、错误是什么以及你使用的是哪个 Python 版本的情况下,我不知道你可能特别犯了什么错误,但大概你得到了一些东西 错了。


.foo 指定相对于包的导入。说from .foo import bar 的意思是“从与我同一个包中的foo 模块,导入bar”。如果省略点,则表示“从标准模块路径中的 foo 模块,导入 bar”。

Intra-package References 上的教程部分(及周边部分)给出了非常简短的解释。 importthe import system in general 的参考文档提供了大部分细节,但 PEP 328 中的原始提案解释了细节和设计背后的基本原理,更加简单。

您需要在 2.x 中去掉点的原因是 2.x 没有任何方法来区分相对导入和绝对导入。只有from foo import bar,意思是“来自和我同一个包的foo模块,或者,如果没有这样的模块,则在标准模块路径中导入bar”。

【讨论】:

  • 是的,我使用的是 Python 3.3,并在 __init__.py 中尝试过 from foo import bar,但这不起作用。模块名称前面的dot 是什么意思?我检查了,你的答案有效。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2021-05-19
相关资源
最近更新 更多