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)
うまくいきます。フラスコのため?
エラーが発生しなくなったのはなぜですか?それはバグですか?
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"])'
code 1を機能させるには、関数quote
ではなく、urllib.parse
モジュールをインポートする必要があります。このようにして、完全なモジュール修飾子でquote
関数を参照できます。このアプローチでは、parse
モジュールで定義されている任意の関数を使用できます。
import urllib.parse
s = urllib.parse.quote('"')
print(s)
code 2は、モジュールのコンテキストではインポートされないため、parse
関数のみをインポートし、モジュール修飾子なしで参照するため、機能します。このアプローチでは、parse
モジュールから明示的にインポートされた関数のみを使用できます。
codeは、flask
がurllib.parse
モジュールを暗黙的にインポートするため機能します。 parse
モジュールは、urllib
モジュールコンテキストで使用可能になります。 urllib
をインポートすると、urllib.parse
がすぐに使用可能になり、code 1のように使用できます