Есть init.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
на module.py
чтобы быть импортируемым, когда путь Python указывает на ?
это, кажется, изменилось с 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
он работает нормально.
2 ответа:
в Python 3.3+ есть Неявные Пакеты Пространства Имен что позволяет создавать пакеты без .
имплицитно пакеты, пространства имен означает, что требование предоставить
__init__.py
file можно отбросить полностью, и пострадавшего ... .старый способ с
__init__.py
файлы по-прежнему работает в Python 2.
ответ Майка правильный, но слишком неточный. Это правда, что Python 3.3+ поддерживает Неявные Пакеты Пространства Имен что позволяет создать пакет без .
это, однако, относится только к пустой __init__.py файлы. Так что пустой __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
:import child1 import child2 import child3