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?
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"])'
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