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

Ответы:



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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.