.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
文件(空的将工作)在a
和b
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?