在 Python 中动态合并文件模块与目录模块

Dynamically merging file modules with directory modules in Python

给定一个具有以下结构的目录:

├── foo
│   ├── bar
│   │   └── baz.py
│   └── bar.py
└── foo.py

和以下文件内容:

foo.py

class Foo:
    pass

foo/bar.py

class Bar:
    pass

foo/bar/baz.py

class Baz:
    pass

我希望能够从其他文件中执行所有这些操作:

from foo import Foo
from foo.bar import Bar
from foo.bar.baz import Baz

即好像每个文件中的定义都是 "merged",模块定义包含同名目录。我怎样才能以不需要我手动指定每个路径的动态方式(无论涉及 __init__.py 还是其他方式)完成此操作?

当我在每个目录中放置空 __init__.py 文件并尝试执行上述导入时,我收到以下错误:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from foo import Foo
ImportError: cannot import name 'Foo'

在我看来,foo.py 文件已被 foo 目录覆盖,因此 foo.py 中的定义不可见。

尝试做:

import foo
print(foo.__file__)

根据您显示的文件夹结构,我希望结果类似于:

.../foo.py

但是当您将 __init__.py 添加到 foo 文件夹时,它会变成:

.../foo/__init__.py

with python packages you cannot actually import a folder 所以最终发生的是你从那个文件夹导入 __init__.py 文件而不是 foo.py 所以你只需要要做的是将 foo.py 移动到文件夹中,然后 将其 重命名为 __init__.py 然后您可以 import foofrom foo import Foo 与你现在已经设置好了。