对于管理,我想在名称空间和目录两个方面划分源文件。你知道吗
我想要的目录方面:
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'>
这段代码表现得非常理想,但似乎是可怕的黑客行为。你知道吗
还有更好的解决方案吗?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐