2017-01-06 30 views
5

python kod 3.5.2AttributeError: Moduł 'urllib' nie ma atrybutu 'składniowy'

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

to dał ten błąd:

AttributeError: module 'urllib' has no attribute 'parse'

kod 2

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

to działa ...

code3

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

działa zbyt. z powodu kolby?

Dlaczego nie mam już błędu? czy to błąd?

+2

Należy "zaimportować urllib.parse". Zakładam, że 'Flask' ​​również importuje' urllib.parse', i dlatego twój trzeci przykład działa. – DyZ

Odpowiedz

4

Pakiet urllib służy wyłącznie jako przestrzeń nazw. Istnieją inne moduły pod numerami urllib, takimi jak request i parse.
Do importowania optymalizacji urllib nie importuje innych modułów pod nim. Ponieważ spowodowałoby to zużycie cykli procesora i pamięci, ale ludzie mogą nie potrzebować tych innych modułów.
Poszczególne moduły pod numerem urllib należy zaimportować osobno w zależności od potrzeb.

Wypróbuj te, pierwszy się nie powiedzie, ale drugi się powiódł, ponieważ po zaimportowaniu flaskflask samo importuje urllib.parse.

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

Dla kodu pracować trzeba zaimportować moduł urllib.parse, a nie funkcję quote. W ten sposób możesz odwołać się do funkcji quote z kwalifikatorem pełnego modułu. Dzięki takiemu podejściu można użyć dowolnej funkcji zdefiniowanej w module parse:

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

kod 2 działa, ponieważ importować tylko funkcję parse i odnoszą się do niego bez modułu kwalifikacjach, ponieważ nie są importowane w kontekst modułu. Dzięki takiemu podejściu można użyć tylko jawnie zaimportowanej funkcji z modułu parse.

kod 3 działa, ponieważ flask importuje niejawnie moduł urllib.parse. Moduł parse staje się dostępny w kontekście modułu urllib. Po zaimportowaniu numeru urllib stanie się łatwo dostępny pod numerem urllib.parse i będzie można go używać w następujący sposób: kod 1