对于管理,我想在命名空间和目录的两个方面划分源文件。
我想要的目录方面:
SomeProject
+- somepackage
| +- __init__.py
| +- foo.py
| +- bar.py
:
:
命名空间的方面:
SomeProject
+- package somepackage
| +- <module>
| +- class Foo
| +- class Bar
:
:
但是python将公开命名的文件视为模块,然后将构建额外的命名空间层次结构。
SomeProject
+- package somepackage
| +- <module>
| +- module foo
| | +- class Foo
| +- module bar
| +- class Bar
:
:
众所周知的解决方案之一是导入__init__.py
中的子模块。
SomeProject/somepackage/__init__.py
:
#!/usr/bin/python3.6
from .foo import Foo
from .bar import Bar
这允许库用户像所需的层次结构一样导入类。 但是实际的层次结构没有改变,像sphinx这样的API文档生成器会读取实际的层次结构。
执行结果:
>>> from SomeProject.somepackage import Foo
>>> type(Foo())
<class 'SomeProject.somepackage.foo.Foo'>
此类文档可能会使用户感到困惑,因此我希望将实际的命名空间层次结构与第一个要求相匹配。
我找到了一种使用exec
的方法。
SomeProject/somepackage/__init__.py
:
#!/usr/bin/python3.6
import sys
import os
import codecs
dir = os.path.dirname(os.path.abspath(__file__))
with codecs.open(dir + "/foo.py", "r", "utf-8") as file:
exec("".join(file.readlines()))
with codecs.open(dir + "/bar.py", "r", "utf-8") as file:
exec("".join(file.readlines()))
然后将获得以下结果:
>>> from SomeProject.somepackage import Foo
>>> type(Foo())
<class 'SomeProject.somepackage.Foo'>
这段代码非常理想,但看起来很糟糕。
是否有更优秀的解决方案?