在Python中清除包中的导入

时间:2013-03-19 19:19:00

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

我有以下项目结构:

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文件中导入它们,然后在import package中使用app.py吗?我试过了,它给了我一个错误。

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

1 个答案:

答案 0 :(得分: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与{3}处于同一级别应用,您最终将bar作为该模块,而不是0。)

在现实生活中,您可能希望从每个包和模块中指定一个__all__,您可能from foo import …(除非允许在交互式解释器中使用{进行测试)。 {1}})。

听起来你说你已经尝试过这个,并且出错了。如果不知道完全你尝试了什么,错误是什么,以及你正在使用哪个Python版本,我根本不知道你可能会遇到什么错误,但可能你有的东西错了。


from foo import *指定包相对导入。说.foo表示“来自与我相同的包中的from .foo import bar模块,导入foo”。如果你不在这里,你会说“从标准模块路径中的bar模块,导入foo”。

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

你需要在2.x中留下点的原因是2.x无法区分相对和绝对导入。只有bar,这意味着“来自与我相同的包的from foo import bar模块,或者,如果没有这样的模块,那么标准模块路径中的模块,导入foo