用Python清理从包中导入的内容

用Python清理从包中导入的内容,python,import,module,python-3.x,package,Python,Import,Module,Python 3.x,Package,我有以下项目结构: project |----app.py |----package |---__init__.py |---module.py |---module2.py |---module3.py |---.... 我的\uuuu init\uuuuu.py文件当前为空。在module.py中,我有一个类的定义: class UsefulClass: ... 在其他模块中也有类似的定义。我的app.py如下所示: #!/usr

我有以下项目结构:

project
|----app.py
|----package
     |---__init__.py
     |---module.py
     |---module2.py
     |---module3.py
     |---....
我的
\uuuu init\uuuuu.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()
....
我的问题是:如何替换package.module中的
。。。是否导入有用的类
语句?即使现在,我只定义了4个模块,这个导入开始看起来很难看。我可以将它们导入
\uuu init\uuuuuuuuupy
文件中,然后在
app.py
中使用
import package
?我试过了,但它给了我一个错误

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

在Python 3中:

package/\uuuuuu init\uuuuuuuuuuuuuupy

from .foo import bar
bar=0
import package
print(package.bar)
package/foo.py

from .foo import bar
bar=0
import package
print(package.bar)
app1.py

from .foo import bar
bar=0
import package
print(package.bar)
app2.py:

from package import bar
print(bar)
无论哪种方式,都会按您的需要打印
0

在Python 2中,只需将
从.foo导入栏更改为
从foo导入栏更改为

(事实上,2.x代码通常在Python3中工作,但它不正确,在某些边缘情况下它会失败。例如,如果你有一个与应用程序处于同一级别的
bar.py
,那么你最终会得到
bar
模块,而不是
0

在现实生活中,您可能希望从每个包和模块中指定一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

听起来你好像在说你已经试过了,但出现了一个错误。如果不知道您到底尝试了什么,错误是什么,以及您使用的是哪种Python版本,我不知道您可能会犯什么错误,但大概是出了什么问题


.foo
指定包的相对导入。说
from.foo import bar
意味着“从与我相同的包中的
foo
模块导入
bar
”。如果不使用点,则表示“从标准模块路径中的
foo
模块导入
bar

关于(和周围部分)的教程部分给出了非常简短的解释。参考文件提供了大部分细节,但中的原始提案解释了细节以及设计背后的基本原理,要简单得多


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

您使用的是什么版本的Python?另外,请确切地告诉我们您尝试了什么,以及您遇到了什么错误(回溯).In
project.package.\uuuu init\uuuuuuuuuupy
:导入子包并使用
\uuuuu all\uuuuuuuu=[…]
我使用的是Python 3.3是的,我使用的是Python 3.3,并且在
\uuu init\uuuuuuuuuupy
中尝试了foo导入栏中的
,但这不起作用。模块名称前面的点是什么意思?我查过了,你的答案有效。非常感谢。