Python: Імпорт urllib.quote


109

Я хотів би використати 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

Відповіді:



54

Якщо вам потрібно обробляти і 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: з urlparse імпортуйте 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.