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

Odpowiedzi:



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

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'                               

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.