Импорт urllib в Python 3.5

У меня есть следующий код:

import urllib
import wget as wget
request = urllib.request.Request(url)

Для последней строки PyCharm показывает предупреждение:

Не удается найти ссылку «запрос» в «__init__.py»

Однако код работает, я получаю ответ от сервера, который я запрашиваю.

Импорт import wget as wget отображается как неиспользуемый. Когда я удаляю этот импорт, я получаю следующее исключение во время выполнения:

AttributeError: модуль «urllib» не имеет атрибута «запрос»

Может кто-нибудь объяснить мне

  1. Как эти две вещи связаны
  2. Почему urllib.request.Request явно неверен(?), несмотря на то, что он задокументирован здесь?

person fweigl    schedule 03.02.2016    source источник


Ответы (2)


urllib сам не импортирует urllib.request. Модуль wget, вероятно, выполняет import urllib.request. С этого момента на urllib.request можно ссылаться.

Предлагаемое решение: написать import urllib.request и тогда должно работать без import wget.

person Sjoerd Job Postmus    schedule 03.02.2016

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

import urllib.request


Рассуждение:

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

Представьте, что есть модуль под названием urllib.foo, который работает только в Windows, а вы работаете в Linux. Если бы система импорта импортировала все подмодули, это могло бы привести к сбою в вашей системе, даже если вы не хотите ее использовать.

Модуль wget, который вы используете, импортирует urllib.request, чтобы использовать его для себя, поэтому python кэширует свой импорт, и он будет частью объекта urllib.

person JBernardo    schedule 03.02.2016