Разница между "из xy import z" и "import xyz as z" - PullRequest
0 голосов
/ 11 мая 2018

В ситуациях, когда вы хотите импортировать вложенный модуль в ваше пространство имен, я всегда писал его так:

from concurrent import futures

Однако недавно я понял, что это можно выразить и с помощью синтаксиса «как». Смотрите следующее:

import concurrent.futures as futures

Субъективное преимущество в том, что он больше похож на другой импорт:

import sys
import os
import concurrent.futures as futures

... с недостатком дополнительной детализации.

Есть ли функциональное различие между ними или один официально предпочтен в ПКП или иным образом?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Есть несколько функциональных отличий. Во-первых, как уже упоминалось в комментариях, import package.thing as thing требует, чтобы thing был модулем (или подпакетом, который на самом деле не является отдельным случаем, поскольку пакеты считаются модулями).

Во-вторых, в Python 3.5 и более поздних версиях, если from package import thing обнаружит, что объект модуля для package не имеет атрибута thing, он попытается найти sys.modules['package.thing'] как запасной вариант. Это было добавлено для обработки определенных случаев кругового относительного импорта. import package.thing as thing пока не выполняет эту обработку, но будет в Python 3.7.

0 голосов
/ 11 мая 2018
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, и для меня это будет считаться анти-паттерном, потому что язык предоставил вам правильный способ сделать то, что вы хотели.

...