web-dev-qa-db-fra.com

AttributeError: le module 'urllib' n'a pas d'attribut 'parse'

python 3.5.2

code 1

import urllib
s = urllib.parse.quote('"')
print(s) 

cela a donné cette erreur:

AttributeError: le module 'urllib' n'a pas d'attribut 'parse'

code 2

from urllib.parse import quote  
# import urllib
# s = urllib.parse.quote('"')
s = quote('"')
print(s) 

ça marche...

code

from flask import Flask
# from urllib.parse import quote  
# s = quote('"')
import urllib
s = urllib.parse.quote('"')
print(s) 

ça marche aussi. à cause de la fiole?

Pourquoi je n'ai plus l'erreur? est-ce un bug?

29
Hong Yinjie

Le package urllib sert uniquement d’espace de noms. Il existe d'autres modules sous urllib tels que request et parse.
Pour l'optimisation, importer urllib n'importe pas les autres modules qu'il contient. En effet, cela consommerait des cycles de processeur et de la mémoire, mais les utilisateurs n'auraient peut-être pas besoin de ces autres modules.
Les modules individuels sous urllib doivent être importés séparément en fonction des besoins.

Essayez-les, le premier échoue mais le second réussit, car lorsque flask est importé, flask lui-même importe urllib.parse.

python3 -c 'import urllib, sys;print(sys.modules["urllib.parse"])'
python3 -c 'import flask, sys;print(sys.modules["urllib.parse"])'
18
Nizam Mohamed

Pour que code 1 fonctionne, vous devez importer le urllib.parse module, pas la fonction quote. De cette façon, vous pouvez vous référer à la fonction quote avec le qualificatif complet du module. Avec cette approche, vous pouvez utiliser n’importe quelle fonction définie dans le module parse:

import urllib.parse
s = urllib.parse.quote('"')
print(s)

code 2 fonctionne, car vous importez uniquement la fonction parse et vous y référez sans qualificateur de module, car il n'est pas importé dans le contexte du module. Avec cette approche, vous ne pouvez utiliser que la fonction explicitement importée du module parse.

code fonctionne, car flask importe implicitement le urllib.parse module. Le module parse devient disponible dans le contexte du module urllib. Une fois que vous avez importé urllib, urllib.parse devient facilement disponible et vous pouvez l’utiliser comme dans code 1

14
Ivan Georgiev