Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Импорт urllib в Python 3.5

Автор вопроса: fweiglОтветов: 2

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

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 явно неверен(?), несмотря на то, что он задокументирован здесь?

pythonurllib

Ответы

Ответ 1 · рейтинг 1 · Sjoerd Job Postmus

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

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

Ответ 2 · рейтинг 1 · JBernardo

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

import urllib.request


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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы