2016-08-02 5 views
0

Я только учусь и практикующий питон, на пути, я читаю о питоне пакетах и, как импортировать в другие модули или пакет в Modules, я предполагаю следующий сценарий,результат, когда __all__ не определен в __init__.py пакета?

У меня есть пакет, как,

Video/ 
    __init__.py 
    formats/ 
     __init__.py 
     mkv.py 
     mp4.py 
    length/ 
     __init__.py 
     morethan20min.py 
     lessthan20min.py 

и ни в

__init__.py 

Я не определилось

__all__ 

что произойдет, если у меня есть оператор импорта, как,

import Video.format.mkv 
import Video.formats.* 

Так как я уже импортировал мы модуль в первом заявлении, что именно происходит после выполнения второго оператора импорта, я не получил концепцию после прочтения на упомянутая ссылка.

+1

Правильное имя - '__init __. Py', а не' __init.py__'. – user2357112

+0

Вы не получите ошибку, ее просто лишний вы либо получите все от Video.format, либо получите что-то конкретное. Это похоже на то, что я хочу всего одного человека, но потом вы принимаете всех. Поэтому нет смысла брать одного человека в первую очередь. –

+0

Кроме того, вы не можете импортировать Video.formats. * '. '*' импорт работает только с формой 'from' оператора импорта. – user2357112

ответ

2

Когда вы

from whatever_package import * 

первым, если пакет-х __init__.py еще не запускалась, то будет работать. (Если вы уже сделали import whatever_package.something_specific, пакет-х __init__.py будет уже бежать.)

Тогда, если whatever_package.__init__ не определяет __all__ списка, импорт будет забрать все текущих содержимого whatever_package объекта *. Это будет что-то определенное в __init__.py и любых подмодулях, которые уже были явно импортированы любым кодом, который был выполнен в вашей программе. Например, если whatever_package «s __init__.py пуст, вы

import whatever_package.something_specific 
from whatever_package import * 
import whatever_package.other_thing 

и никакие другие операторы импорта, относящиеся к whatever_package существуют в вашей программе, то import * подберут something_specific, но не любые другие подмодулями whatever_package, такие как other_thing.


* исключая все, что начинается с символом подчеркивания, как стандарт для любого import *, без __all__ списка, будь вы импортируете из пакета или обычного модуля.

+0

Что произойдет, если 'something_specific .__ init__' не является пустым – user6654733

+0

@ user6654733: Импорт будет получать все, что определено' __init __. Py'. – user2357112

+0

@ user6654733: тогда в чем преимущество наличия * нотации в инструкции import? Полезно, только когда мы определяем '__all__' ?? – user6654733