python - 如何重新组织 python 模块以不反映目录结构?
问题描述
我正在编写一个代码生成器,并希望能够导出到不同的文件类型。该foo
模块包含不同类(subA、subA、subC)的片段。bar.py
并baz.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
这让我可以导入foo
,foo.bar
但尝试访问
foo.bar.subA
给了我
AttributeError: type object 'bar' has no attribute 'subA'
我不确定我在这里缺少什么,所以我愿意接受建议。
解决方案
通过引入处理别名的包,我能够使它足够方便地工作,如下所示:
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
,我可以不用它,但它会做。
推荐阅读
- docker - flask docker - equests.exceptions.ConnectionError:HTTPConnectionPool(host ='localhost',port = 8080):url超过最大重试次数:/users
- java - 如何在 Android 工具栏中部分禁用单击主页按钮?
- c++ - C++ 模板避免两次传递元素类型
- c++ - cpp中的类定义但遇到错误:不完整类型的无效使用
- blazor - MatBlazor - 嵌入式资源文件不输出
- xamarin.forms - Xamarin 与 aot 和 mono 形成交互
- php - php多数组分组和最大值每组和每个数组的总和
- intellij-idea - 无法下载所有 Maven 依赖项
- excel - VBA Sumifs MultiSelect Item ListboxList
- javascript - 使用 JavaScript,如何在最后移动更新字段的同时基于前一个对象创建一个新对象?