Разница между "от xy import z" и "import xyz as z"
В ситуациях, когда вы хотите импортировать вложенный модуль в пространство имен, я всегда писал его так:
from concurrent import futures
Однако я недавно понял, что это можно выразить, используя синтаксис "как". См. Следующее:
import concurrent.futures as futures
Что имеет субъективное преимущество, похожее на другие виды импорта:
import sys
import os
import concurrent.futures as futures
... с недостатком добавленной многословия.
Существует ли функциональная разница между этими двумя, или она официально предпочтительна в PEP или иначе?
Ответы
Ответ 1
Есть несколько функциональных отличий. Во-первых, как уже упоминалось в комментариях, import package.thing as thing
требует thing
чтобы thing
был модулем (или подпакет, который на самом деле не является отдельным случаем, потому что пакеты считаются модулями).
Во-вторых, в Python 3.5 и более поздних версиях, если from package import thing
объекта from package import thing
обнаружено, что объект модуля для package
не имеет атрибута thing
, он попытается найти sys.modules['package.thing']
в качестве резервной копии. Это было добавлено для обработки определенных случаев кругового относительного импорта. import package.thing as thing
еще не выполняет эту обработку, но это будет в Python 3.7.
Ответ 2
import concurrent.futures as futures
Позволяет ссылаться на модуле под futures
именами в коде (в отличие от concurrent.futures
без, as
синтаксис). Тем не менее, типизация в основном избыточна - вы импортируете что-то и объявляете свое имя точно таким же. Стандартный синтаксис для этого типа импорта - это from <package> import <module>
.
Характерный пункт о вашем вопросе является то, что, as
синтаксис в основном для поддержки нескольких импорта одного и того же имени без затирания друг друга. Например.
from concurrent import futures
from other.module import futures as my_futures
Все остальное, и вы злоупотребляете, as
синтаксис и мне будет считаться антишаблоном, потому что язык при условии, вам правильный способа сделать то, что вы хотели.