Python のドキュメントによると、dir()
(引数なし) との両方locals()
が と呼ばれる変数のリストに評価されlocal scope
ます。1 つ目は名前のリストを返し、2 つ目は名前と値のペアの辞書を返します。違いはそれだけですか?これは常に有効ですか?
assert dir() == sorted( locals().keys() )
Python のドキュメントによると、dir()
(引数なし) との両方locals()
が と呼ばれる変数のリストに評価されlocal scope
ます。1 つ目は名前のリストを返し、2 つ目は名前と値のペアの辞書を返します。違いはそれだけですか?これは常に有効ですか?
assert dir() == sorted( locals().keys() )
引数なしで呼び出された場合の出力はdir()
とほとんど同じですlocals()
がdir()
、文字列のリストをlocals()
返し、辞書を返します。その辞書を更新して新しい変数を追加できます。
dir(...)
dir([object]) -> list of strings
If called without an argument, return the names in the current scope.
locals(...)
locals() -> dictionary
Update and return a dictionary containing the current scope's local variables.
タイプ:
>>> type(locals())
<type 'dict'>
>>> type(dir())
<type 'list'>
次を使用して新しい変数を更新または追加しますlocals()
。
In [2]: locals()['a']=2
In [3]: a
Out[3]: 2
ただし、dir()
これは機能しません。
In [7]: dir()[-2]
Out[7]: 'a'
In [8]: dir()[-2]=10
In [9]: dir()[-2]
Out[9]: 'a'
In [10]: a
Out[10]: 2
正確な質問は、「変数がローカルスコープで定義されているかどうかを確認するためにどの関数を使用するか」です。
Python で未定義の変数にアクセスすると、例外が発生します。
>>> undefined
NameError: name 'undefined' is not defined
他の例外と同様に、キャッチできます。
try:
might_exist
except NameError:
# Variable does not exist
else:
# Variable does exist
より良いコードを書くには、言語アーキテクチャを知る必要があります。
それはあなたのコードをより良くしません。そのようなことが必要な状況に陥ってはいけません。ほとんどの場合、それは間違ったアプローチです。