Python: importazione di urllib.quote


110

Vorrei usare urllib.quote(). Ma python (python3) non trova il modulo. Supponiamo di avere questa riga di codice:

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

Come faccio a importare urllib.quote?

import urllibo import urllib.quoteentrambi danno

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

Quello che mi confonde è che urllib.requestè accessibile tramiteimport urllib.request

Risposte:



54

Se hai bisogno di gestire sia Python 2.x che 3.x puoi catturare l'eccezione e caricare l'alternativa.

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

Puoi anche usare il wrapper di compatibilità python sei per gestire questo.

from six.moves.urllib.parse import quote

1
Dovresti essere più lungimirante. Supponiamo python3 e tranne 2.7. prova: importa urllib.parse come urlparse tranne ImportError: da urlparse importa urlparse # python 2.7.11
Lincoln Randall McFarland

@LincolnRandallMcFarland Ciò di cui stai parlando è una micro ottimizzazione così irrilevante. Non è più difficile o più facile abbandonare completamente il supporto per Python 2.X nel progetto in futuro.
eandersson

Se vuoi rendere il lancio e la cattura di un'eccezione il processo di importazione standard del tuo caso d'uso più comune solo perché ..., non ci sono cicli fuori dal mio orologio ma sappi cosa stai facendo: le eccezioni dovrebbero essere eccezionali. È la differenza tra farlo funzionare e renderlo migliore.
Lincoln Randall McFarland

Questa è una discussione così priva di significato. Entrambi sono validi ... se prendi l'eccezione Python 3, prova a importare la libreria Python 2.7, ma per qualche motivo mancano entrambi l'eccezione generata dirà che manca la libreria Python 2.7. Molto confuso. In realtà, se ti interessano così tanto le eccezioni, ci sono modi migliori per gestirlo, ad esempio sei o controllare la versione di Python invece di fare affidamento su un'eccezione. ma in realtà, se ti interessa così tanto qualcosa di così insignificante, non dovresti mantenere la compatibilità con le versioni precedenti di Python 2 perché quest'anno è comunque EOL.
eandersson

14

urllib ha subito alcune modifiche in Python3 e ora può essere importato dal sottomodulo di analisi

>>> from urllib.parse import quote  
>>> quote('"')                      
'%22'                               

4

Questo è come lo gestisco, senza usare eccezioni.

import sys
if sys.version_info.major > 2:  # Python 3 or later
    from urllib.parse import quote
else:  # Python 2
    from urllib import quote
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.