web-dev-qa-db-ja.com

AttributeError:モジュール「urllib」には属性「parse」がありません

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) 

できます...

code

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

うまくいきます。フラスコのため?

エラーが発生しなくなったのはなぜですか?それはバグですか?

29
Hong Yinjie

urllibパッケージは名前空間としてのみ機能します。 urllibrequestなど、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"])'
18
Nizam Mohamed

code 1を機能させるには、関数quoteではなく、urllib.parseモジュールをインポートする必要があります。このようにして、完全なモジュール修飾子でquote関数を参照できます。このアプローチでは、parseモジュールで定義されている任意の関数を使用できます。

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

code 2は、モジュールのコンテキストではインポートされないため、parse関数のみをインポートし、モジュール修飾子なしで参照するため、機能します。このアプローチでは、parseモジュールから明示的にインポートされた関数のみを使用できます。

codeは、flaskurllib.parseモジュールを暗黙的にインポートするため機能します。 parseモジュールは、urllibモジュールコンテキストで使用可能になります。 urllibをインポートすると、urllib.parseがすぐに使用可能になり、code 1のように使用できます

14
Ivan Georgiev