Python: импорт urllib.quote

112

Хочу использовать urllib.quote(). Но python (python3) не находит модуль. Предположим, у меня есть такая строка кода:

print(urllib.quote("châteu", safe=''))

Как импортировать urllib.quote?

import urllibили import urllib.quoteоба дают

AttributeError: 'module' object has no attribute 'quote'

Меня смущает то, что urllib.requestдоступно черезimport urllib.request

Имрек
источник

Ответы:

183

В Python 3.x вам необходимо импортировать urllib.parse.quote:

>>> import urllib.parse
>>> urllib.parse.quote("châteu", safe='')
'ch%C3%A2teu'

Согласно документации модуля Python 2.xurllib :

НОТА

urllibМодуль был разделен на части и переименован в Python 3 к urllib.request, urllib.parseи urllib.error.

фальсетру
источник
56

Если вам нужно обрабатывать как Python 2.x, так и 3.x, вы можете перехватить исключение и загрузить альтернативу.

try:
    from urllib import quote  # Python 2.X
except ImportError:
    from urllib.parse import quote  # Python 3+

Вы также можете использовать шестую оболочку совместимости с python, чтобы справиться с этим.

from six.moves.urllib.parse import quote
Eandersson
источник
1
Вы должны быть более дальновидными. Предположим, что python3 и кроме 2.7. попробуйте: импортировать urllib.parse как urlparse, кроме ImportError: from urlparse import urlparse # python 2.7.11
Линкольн Рэндалл МакФарланд
@LincolnRandallMcFarland То, о чем вы говорите, - это такая нерелевантная микрооптимизация. Это не усложняет и не упрощает полное прекращение поддержки Python 2.X в проекте в будущем.
eandersson
Если вы хотите сделать генерирование и перехват исключения стандартным процессом импорта вашего наиболее распространенного варианта использования только потому, что ..., мои часы не цикличны, но вы знаете, что делаете: исключения должны быть исключительными. В этом разница между тем, чтобы это работало, и улучшением.
Линкольн Рэндалл МакФарланд,
Это такая бессмысленная дискуссия. Оба действительны ... если вы поймаете исключение Python 3, попробуйте импортировать библиотеку Python 2.7, но по какой-то причине оба отсутствуют, выброшенное исключение скажет, что отсутствует библиотека Python 2.7. Очень запутанно. На самом деле, если вы так заботитесь об исключениях, есть лучшие способы справиться с этим, например, шесть или проверка версии Python вместо того, чтобы полагаться на исключение. но на самом деле, если вы так сильно заботитесь о чем-то настолько бессмысленном, вам вообще не следует сохранять обратную совместимость Python 2, потому что в этом году все равно EOL.
eandersson
14

urllib претерпел некоторые изменения в Python3 и теперь может быть импортирован из подмодуля синтаксического анализа

>>> from urllib.parse import quote  
>>> quote('"')                      
'%22'                               
Джастин Фэй
источник
4

Вот как я с этим справляюсь, без исключений.

import sys
if sys.version_info.major > 2:  # Python 3 or later
    from urllib.parse import quote
else:  # Python 2
    from urllib import quote
Yutenji
источник
1

Использование six:

from six.moves.urllib.parse import quote

six упростит проблемы совместимости между Python 2 и Python 3, такие как разные пути импорта.

Джеймс Томас, Луна, 1979
источник