変数が存在するかどうか確認したい今私はこのようなことをしています:
try:
myVar
except NameError:
# Do something.
例外なく他の方法はありますか?
ローカル変数の存在を確認するには
if 'myVar' in locals():
# myVar exists.
グローバル変数の存在を確認するには
if 'myVar' in globals():
# myVar exists.
オブジェクトに属性があるかどうかを確認するには
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
(暗黙的または明示的に)定義または設定されていない変数の使用は、プログラムのロジックが適切に検討されていないことを示しているため、ほとんどの場合、 any 言語では悪いことです。予期しない動作が発生します。
次のトリックは、あなたのものと似ていますが、使用する前に変数に some valueがあることを確認します。
try:
myVar
except NameError:
myVar = None
# Now you're free to use myVar without Python complaining.
しかし、私はまだそれが良い考えだとは思わない - 私の意見では、このような状況が発生しないようにあなたのコードをリファクタリングするべきです。
簡単な方法は、最初にmyVar = None
と言って初期化することです。
それから後で。
if myVar is not None:
# Do something
変数の存在をテストするには、try/exceptを使用するのが最善の方法です。しかし、ほとんど確実に、グローバル変数を設定/テストするよりも、自分がしていることをすべて実行するよりよい方法があります。
たとえば、最初に関数を呼び出すときにモジュールレベルの変数を初期化したい場合は、次のようなコードを使用したほうがよいでしょう。
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
オブジェクト/モジュールの場合は、
'var' in dir(obj)
例えば、
>>> class Something(object):
... pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
このテストは、 user97370の答え のように、関数内で使用されることになっていると思います。グローバルネームスペースを汚染するので、私はその答えが好きではありません。それを修正する一つの方法は代わりにクラスを使うことです:
class InitMyVariable(object):
my_variable = None
def __call__(self):
if self.my_variable is None:
self.my_variable = ...
これはコードが複雑になり、次のような疑問を投げかけるので、私はこれが好きではありません。幸いなことに、Pythonはしばらくの間関数に属性を持たせることを許可してきました。これは私たちにこの簡単な解決法を与えてくれます:
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
Pythonではcatch
は except
と呼ばれています。それ以外は、そのような単純な場合には問題ありません。オブジェクトに属性があるかどうかを確認するために使用できる AttributeError
があります。
JSON/Dictにキーが存在するかどうかを確認することは、前回の回答に追加されたものです。
'Json/Dictオブジェクト名' .has_key( 'キー名')
これはTrueまたはFalseを返します
このような状況に対処するためによく機能する方法は、変数が存在するかどうかを明示的にチェックせずに、先に進み、存在しない可能性のある変数の最初の使用法をtry/except NameErrorでラップすることです。
# Search for entry.
for x in y:
if x == 3:
found = x
# Work with found entry.
try:
print('Found: {0}'.format(found))
except NameError:
print('Not found')
else:
# Handle rest of Found case here
...