Разница между "от 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 синтаксис и мне будет считаться антишаблоном, потому что язык при условии, вам правильный способа сделать то, что вы хотели.