Есть 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 82

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