用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
模块,或者,如果没有这样的模块,则来自标准模块路径中的模块,importbar
”您使用的是什么版本的Python?另外,请确切地告诉我们您尝试了什么,以及您遇到了什么错误(回溯).Inproject.package.\uuuu init\uuuuuuuuuupy
:导入子包并使用\uuuuu all\uuuuuuuu=[…]
我使用的是Python 3.3是的,我使用的是Python 3.3,并且在\uuu init\uuuuuuuuuupy
中尝试了foo导入栏中的,但这不起作用。模块名称前面的点是什么意思?我查过了,你的答案有效。非常感谢。