Импорт 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)


arrow_upward
1
arrow_downward

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

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

person Sjoerd Job Postmus    schedule 03.02.2016

arrow_upward
1
arrow_downward

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

import urllib.request


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

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

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

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

person JBernardo    schedule 03.02.2016