Python: importowanie urllib.quote

110

Chciałbym skorzystać urllib.quote(). Ale python (python3) nie znajduje modułu. Załóżmy, że mam ten wiersz kodu:

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

Jak zaimportować urllib.quote?

import urlliblub import urllib.quoteobie dają

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

Wprawia mnie w zakłopotanie to, że urllib.requestjest dostępny za pośrednictwemimport urllib.request

imrek
źródło

Odpowiedzi:

180

W Pythonie 3.x musisz zaimportować urllib.parse.quote:

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

Zgodnie z dokumentacją modułu Python 2.xurllib :

UWAGA

urllibModuł został podzielony na części i przemianowany w Pythonie 3, urllib.request, urllib.parse, i urllib.error.

falsetru
źródło
54

Jeśli potrzebujesz obsługiwać zarówno Python 2.x, jak i 3.x, możesz złapać wyjątek i załadować alternatywę.

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

Możesz także użyć szóstego opakowania kompatybilności z Pythonem, aby sobie z tym poradzić.

from six.moves.urllib.parse import quote
eandersson
źródło
1
Powinieneś bardziej patrzeć w przyszłość. Załóżmy, że python3 i oprócz wersji 2.7. spróbuj: import urllib.parse as urlparse z wyjątkiem ImportError: from urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland
@LincolnRandallMcFarland To, o czym mówisz, to taka nieistotna mikro optymalizacja. Dzięki temu całkowite porzucenie obsługi Pythona 2.X w projekcie w przyszłości nie będzie trudniejsze ani łatwiejsze.
eandersson
Jeśli chcesz, aby wyrzucanie i przechwytywanie wyjątków stało się standardowym procesem importowania Twojego najczęstszego przypadku użycia tylko dlatego, że ... nie ma cyklów poza moim zegarem, ale wiesz, co robisz: wyjątki powinny być wyjątkowe. To różnica między sprawieniem, by działał, a ulepszeniem.
Lincoln Randall McFarland
To taka bezsensowna dyskusja. Oba są prawidłowe ... jeśli złapiesz wyjątek Python 3, spróbuj zaimportować bibliotekę Python 2.7, ale z jakiegoś powodu w obu brakuje, zgłoszony wyjątek powie, że brakuje biblioteki Python 2.7. Bardzo mylące. W rzeczywistości, jeśli tak bardzo zależy Ci na wyjątkach, są lepsze sposoby, aby sobie z tym poradzić, np. Sześć lub sprawdzenie wersji Pythona zamiast polegać na wyjątku. ale w rzeczywistości, jeśli tak bardzo zależy ci na czymś tak bezsensownym, nie powinieneś w ogóle zachowywać wstecznej kompatybilności Pythona 2, ponieważ i tak jest to EOL w tym roku.
eandersson
14

urllib przeszedł pewne zmiany w Pythonie3 i można go teraz zaimportować z modułu podrzędnego parsowania

>>> from urllib.parse import quote  
>>> quote('"')                      
'%22'                               
Justin Fay
źródło
4

Oto jak sobie z tym radzę, bez wyjątków.

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
źródło