小编典典

Python 3.3+ 中的包不需要 __init__.py

all

我正在使用 Python 3.5.1。我在这里阅读了文档和包部分:https
://docs.python.org/3/tutorial/modules.html#packages

现在,我有以下结构:

/home/wujek/Playground/a/b/module.py

module.py

class Foo:
    def __init__(self):
        print('initializing Foo')

现在,在/home/wujek/Playground

~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>

同样,现在在家里,超级文件夹Playground

~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>

实际上,我可以做各种各样的事情:

~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b

为什么这行得通?我虽然需要有__init__.py文件(空的可以工作)a并且当Python路径指向文件夹时可以b导入?module.py``Playground

这似乎已经从 Python 2.7 改变了:

~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module

两者__init__.py兼而有之,效果很好。~/Playground/a``~/Playground/a/b


阅读 112

收藏
2022-04-13

共1个答案

小编典典

Python 3.3+
具有隐式命名空间包,允许它创建没有__init__.py文件的包。

允许隐式命名空间包意味着 可以完全放弃*__init__.py提供文件的要求,并影响…。 *

使用文件的旧方法__init__.py仍然可以在 Python 2 中使用。

2022-04-13