Python: importando urllib.quote


110

Eu gostaria de usar urllib.quote(). Mas python (python3) não está encontrando o módulo. Suponha que eu tenha esta linha de código:

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

Como faço para importar urllib.quote?

import urllibou import urllib.quoteambos dão

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

O que me confunde é que urllib.requesté acessível viaimport urllib.request

Respostas:



54

Se você precisa lidar com Python 2.xe 3.x, você pode capturar a exceção e carregar a alternativa.

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

Você também pode usar o wrapper de compatibilidade seis do Python para lidar com isso.

from six.moves.urllib.parse import quote

1
Você deve estar mais voltado para o futuro. Suponha python3 e exceto 2.7. try: import urllib.parse as urlparse exceto ImportError: from urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland

@LincolnRandallMcFarland O que você está falando é uma micro otimização irrelevante. Não torna mais difícil ou fácil abandonar completamente o suporte Python 2.X no projeto no futuro.
eandersson

Se você deseja que o lançamento e a captura de uma exceção sejam o processo de importação padrão do seu caso de uso mais comum, só porque ..., não é um ciclo fora do meu relógio, mas saiba o que está fazendo: as exceções devem ser excepcionais. É a diferença entre fazer funcionar e melhorar.
Lincoln Randall McFarland

Esta é uma discussão tão sem sentido. Ambos são válidos ... se você capturar a exceção do Python 3, tente importar a biblioteca do Python 2.7, mas por alguma razão ambos estão perdendo a exceção lançada dirá que está faltando a biblioteca do Python 2.7. Muito confuso. Na realidade, se você se preocupa tanto com as exceções, existem maneiras melhores de lidar com isso, por exemplo, seis ou verificar a versão do Python em vez de confiar em uma exceção. mas, na realidade, se você se preocupa tanto com algo tão sem sentido, você não deveria manter a compatibilidade com versões anteriores do Python 2 porque, de qualquer forma, é EOL este ano.
eandersson

14

urllib passou por algumas mudanças no Python3 e agora pode ser importado do submódulo parse

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

4

É assim que eu lido com isso, sem usar exceções.

import sys
if sys.version_info.major > 2:  # Python 3 or later
    from urllib.parse import quote
else:  # Python 2
    from urllib import quote
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.