Синтаксис импорта нескольких классов из модуля

#python

#python

Вопрос:

Я читаю некоторый код, который содержит следующий оператор импорта:

 from threading import local as thread_local, Event, Thread
  

Сначала этот синтаксис озадачил меня, но я думаю, что он эквивалентен:

 from threading import local as thread_local
from threading import Event
from threading import Thread
  

Кто-нибудь может подтвердить, так ли это?

Комментарии:

1. ДА. Иначе как вы могли бы определить более одного псевдонима при импорте? from threading import local as t_local, Event as Harambe, Thread as Banana .

2. Да, я уверен! Я думаю, что все сообщество Python также будет позитивным!

Ответ №1:

Вы можете проверить это в официальной документации. Вот документация по import синтаксису:

 import_stmt     ::=  "import" module ["as" name] ( "," module ["as" name] )*
                     | "from" relative_module "import" identifier ["as" name]
                     ( "," identifier ["as" name] )*
                     | "from" relative_module "import" "(" identifier ["as" name]
                     ( "," identifier ["as" name] )* [","] ")"
                     | "from" module "import" "*"
module          ::=  (identifier ".")* identifier
relative_module ::=  "."* module | "." 
name            ::=  identifier
  

Обратите внимание, что у вас всегда есть import module ["as" name] и identifier ["as" name] , в том числе в определении списка:

 ( "," identifier ["as" name] )* 
  

Это означает, что за запятой , следует идентификатор, необязательно присваиваемый as имени, и )* означает, что «эта группа может повторяться ноль или более раз, включая приведенный вами пример.

Это также объясняется на той же странице чуть позже:

from Форма использует немного более сложный процесс:

  1. найдите модуль, указанный в from предложении, загрузите и инициализируйте его, если необходимо;
  2. для каждого из идентификаторов, указанных в предложениях импорта:
    1. проверьте, имеет ли импортированный модуль атрибут с таким именем
    2. если нет, попробуйте импортировать подмодуль с этим именем, а затем снова проверьте импортированный модуль на наличие этого атрибута
    3. если атрибут не найден, ImportError вызывается.
    4. в противном случае ссылка на это значение сохраняется в локальном пространстве имен, используя имя в as предложении, если оно присутствует, в противном случае используя имя атрибута

Ответ №2:

Да, это так.

Проверьте все способы, которыми можно импортировать модуль в python: https://docs.python.org/2/reference/simple_stmts.html#the-import-statement