.py在Python 3中不需要包?

我正在使用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文件(空的将工作)在ab for module.py可以导入时Python路径指向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

~/Playground/a~/Playground/a/b中都有__init__.py ,它可以正常工作。


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

允许隐式名称空间包意味着提供__init__.py文件的要求可以完全丢弃 ,并且受到影响......。

__init__.py文件的旧方式仍然可以像Python 2中那样工作。


@迈克的回答是正确的,但也不准确。 确实,Python 3.3+支持隐式命名空间包,允许创建一个没有__init__.py文件的包。

但是,这仅适用于EMPTY __init__.py文件。 所以EMPTY __init__.py文件不再需要,可以省略。 如果您想将模块导入包中,您仍需要一个列出所有导入的__init__.py文件。

目录结构示例:

  parent_package/
     __init__.py            <- EMPTY, NOT NECESSARY in Python 3.3+
     child_package/
          __init__.py       <- STILL REQUIRED to import all child modules
          child1.py
          child2.py
          child3.py

child_package __init__文件:

import child1
import child2
import child3
链接地址: http://www.djcxy.com/p/9329.html

上一篇: .py not required for packages in Python 3?

下一篇: Why do some python scripts declare main() in this manner?