首页 > 解决方案 > 如何重新组织 python 模块以不反映目录结构?

问题描述

我正在编写一个代码生成器,并希望能够导出到不同的文件类型。该foo模块包含不同类(subA、subA、subC)的片段。bar.pybaz.py保存不同语言的片段。
我发现导入foo.bar和获取该bar语言的所有片段比bar为每个类都导入要方便得多。
同样,我宁愿将特定类的所有片段都放在同一目录中,因此以下组织

foo
| __init__.py
+ subA
| | __init__.py
| | bar.py
| ` baz.py
+ subB
| | __init__.py
| | bar.py
| ` baz.py
` subC
  | __init__.py
  | bar.py
  ` baz.py

我希望能够像这样导入: from foo.bar import subA应该让我访问foo/subA/bar.py

我想我需要重新组织,foo/__init__.py但我不知道到底要做什么。我的猜测是我需要创建一个空模块或命名空间,甚至只是我用所需模块填充的对象。
但我不断收到语法错误。

目前我foo/__init__.py看起来像这样

import foo.subA.bar
import foo.subB.bar
import foo.subC.bar

class bar:
    def __init__(self):
        self.subA = foo.subA.bar
        self.subB = foo.subB.bar
        self.subC = foo.subC.bar

这让我可以导入foofoo.bar但尝试访问 foo.bar.subA给了我

AttributeError: type object 'bar' has no attribute 'subA'

我不确定我在这里缺少什么,所以我愿意接受建议。

标签: pythonmodule

解决方案


通过引入处理别名的包,我能够使它足够方便地工作,如下所示:

foo
| __init__.py
+ subA
| | __init__.py
| | bar.py
| ` baz.py
+ subB
| | __init__.py
| | bar.py
| ` baz.py
+ subC
| | __init__.py
| | bar.py
| ` baz.py
| bar.py
` baz.py

bar.py看起来像这样:

import foo.subA.bar as subA
import foo.subB.bar as subB
import foo.subC.bar as subC

这使我能够import foo.bar并获得foo.bar.subA指向foo/subA/bar.py.

这不是我的想法,因为它需要我维护一个别名列表bar.py,我可以不用它,但它会做。


推荐阅读