Иногда требуется "from ... import ...", а обычный "import ..." не всегда работает? Почему? - PullRequest
5 голосов
/ 15 февраля 2020

Я всегда думал, что делать from x import y с последующим непосредственным использованием y или import x и последующим использованием x.y было только вопросом стиля и избегания конфликтов имен. Но похоже, что это не всегда так. Иногда from ... import ... кажется обязательным :

Python 3.7.5 (default, Nov 20 2019, 09:21:52)
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>> PIL.__version__
'6.1.0'
>>> im = PIL.Image.open("test.png")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'PIL' has no attribute 'Image'
>>> from PIL import Image
>>> im = Image.open("test.png")
>>>

Я что-то здесь не так делаю?

Если нет, то кто-нибудь может объяснить, пожалуйста, механику, стоящую за этим поведением? Спасибо!

1 Ответ

7 голосов
/ 15 февраля 2020

Для подмодулей вы должны явно импортировать подмодуль, независимо от того, используете ли вы from. Импорт не- from должен выглядеть следующим образом:

import PIL.Image

В противном случае Python не будет загружать подмодуль, а подмодуль будет доступен только в том случае, если сам пакет импортирует подмодуль для вас или если некоторые предыдущий код явно импортировал субмодуль.

...