即使一个模块

时间:2018-03-29 03:35:02

标签: python

对于管理,我想在命名空间和目录的两个方面划分源文件。

我想要的目录方面:

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'>

这段代码非常理想,但看起来很糟糕。

是否有更优秀的解决方案?

0 个答案:

没有答案