【发布时间】:2017-06-11 19:02:07
【问题描述】:
我的问题是关于编写 Python (3.x) 包和(子)模块以及正确使用 __init__.py 文件来声明命名空间。
我以前用 C++ 编写代码,所以我喜欢使用很多单独的文件来组织项目。例如,(imo) 如果一个模块包含多个类,则每个类都应该在一个单独的文件中。
由于我缺乏 Python 开发经验,因此很难用一个简单的问题来表达我的想法。 所以我们以下面这个小python包为例。
目录布局
dir
|
+-- example
| |
| +-- script.py
|
+-- package
|
+-- __init__.py
|
+-- foo.py
|
+-- subpackage
|
+-- __init__.py
|
+-- bar.py
让我们看一下文件。
文件内容
package/foo.py:
def foo:
print('foo')
package/subpackage/bar.py:
def bar:
print('bar')
以下example/script.py 工作正常。
import sys
sys.path.insert(0, '..')
import package
import package.subpackage
package.foo.foo()
package.subpackage.bar.bar()
我不喜欢使用package.foo.foo() / package.subpackage.bar.bar(),我想使用package.foo() / package.subpackage.bar()。
而且我不想使用from package.subpackage.bar import bar,因为我不想将子包的命名空间混入脚本中。
解决方案
我使用__init__.py 文件来实现这一点。
package/__init__.py:
from package.foo import foo
package/subpackage/__init__.py:
from package.subpackage.bar import bar
问题
-
这是定义命名空间的好方法吗?或者有没有更好/通用的方法来组织 python 中包的文件系统。 (我没有找到合适的教程/示例。)
-
在文件
package/subpackage/__init__.py中,为什么必须是:from package.subpackage.bar import bar而不是:
from subpackage.bar import bar?
这会导致错误:
Traceback (most recent call last):
File "script.py", line x, in <module>
import package.subpackage
File "..\package\subpackage\__init__.py", line x, in <module>
from subpackage.bar import bar
ImportError: No module named 'subpackage'
【问题讨论】:
标签: python python-3.x import namespaces python-module