У меня есть следующий код:
import urllib
import wget as wget
request = urllib.request.Request(url)
Для последней строки PyCharm показывает предупреждение:
Не удается найти ссылку "запрос" в "__init__.py"
Однако код работает, я получаю ответ от сервера, который я запрашиваю.
Импорт import wget as wget отображается как неиспользуемый. Когда я удаляю этот импорт, я получаю следующее исключение во время выполнения:
AttributeError: модуль "urllib" не имеет атрибута "запрос"
Может кто-нибудь объяснить мне
- Как эти две вещи связаны
- Почему
urllib.request.Request явно неверен(?), несмотря на то, что он задокументирован здесь?
Ответ 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.