如何划分类源文件即使一个modu

2024-04-25 20:02:18 发布

您现在位置: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'>

这段代码表现得非常理想,但似乎是可怕的黑客行为。你知道吗

还有更好的解决方案吗?你知道吗


Tags: frompyimportfoo层次结构initbar空间