python 3.5.2
代码1
import urllib
s = urllib.parse.quote('"')
print(s)
它给出了这个错误:
AttributeError:模块'urllib'没有属性'parse'
代码2
from urllib.parse import quote
# import urllib
# s = urllib.parse.quote('"')
s = quote('"')
print(s)
它有效......
CODE3
from flask import Flask
# from urllib.parse import quote
# s = quote('"')
import urllib
s = urllib.parse.quote('"')
print(s)
也有效。因为烧瓶?
为什么我不再有错误?这是一个错误吗?
答案 0 :(得分:12)
urllib
包仅用作命名空间。 urllib
下的其他模块包括request
和parse
对于优化,导入urllib
不会导入其下的其他模块。因为这样做会占用处理器周期和内存,但人们可能不需要那些其他模块
urllib
下的各个模块必须根据需要单独导入。
尝试这些,第一个失败但第二个失败,因为导入flask
时flask
导入urllib.parse
。
python3 -c 'import urllib, sys;print(sys.modules["urllib.parse"])'
python3 -c 'import flask, sys;print(sys.modules["urllib.parse"])'
答案 1 :(得分:10)
要使代码1 起作用,您需要导入urllib.parse
模块,而不是函数quote
。这样,您可以使用完整模块限定符来引用quote
函数。使用此方法,您可以使用parse
模块中定义的任何函数:
import urllib.parse
s = urllib.parse.quote('"')
print(s)
代码2 有效,因为您只导入parse
函数并在没有模块限定符的情况下引用它,因为它不会在模块的上下文中导入。使用此方法,您只能使用parse
模块中显式导入的函数。
代码3 有效,因为flask
会隐式导入urllib.parse
模块。 parse
模块在urllib
模块上下文中可用。导入urllib
后,urllib.parse
随时可用,您可以在代码1
答案 2 :(得分:2)
我遇到了类似的问题,并意识到这是一个版本问题。所以这是我的解决方案,以防万一:
# For Python 2.X
urllib.quote_plus(query)
# For Python 3.x
urllib.parse.quote_plus(query)