web-dev-qa-db-ja.com

変数が存在するかどうかをどうやって確認しますか?

変数が存在するかどうか確認したい今私はこのようなことをしています:

try:
   myVar
except NameError:
   # Do something.

例外なく他の方法はありますか?

749
Max Frai

ローカル変数の存在を確認するには

if 'myVar' in locals():
  # myVar exists.

グローバル変数の存在を確認するには

if 'myVar' in globals():
  # myVar exists.

オブジェクトに属性があるかどうかを確認するには

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.
1319
Ayman Hourieh

(暗黙的または明示的に)定義または設定されていない変数の使用は、プログラムのロジックが適切に検討されていないことを示しているため、ほとんどの場合、 any 言語では悪いことです。予期しない動作が発生します。

次のトリックは、あなたのものと似ていますが、使用する前に変数に some valueがあることを確認します。

try:
    myVar
except NameError:
    myVar = None
# Now you're free to use myVar without Python complaining.

しかし、私はまだそれが良い考えだとは思わない - 私の意見では、このような状況が発生しないようにあなたのコードをリファクタリングするべきです。

100
paxdiablo

簡単な方法は、最初にmyVar = Noneと言って初期化することです。

それから後で。

if myVar is not None:
    # Do something
28

変数の存在をテストするには、try/exceptを使用するのが最善の方法です。しかし、ほとんど確実に、グローバル変数を設定/テストするよりも、自分がしていることをすべて実行するよりよい方法があります。

たとえば、最初に関数を呼び出すときにモジュールレベルの変数を初期化したい場合は、次のようなコードを使用したほうがよいでしょう。

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...
20
user97370

オブジェクト/モジュールの場合は、

'var' in dir(obj)

例えば、

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
15
Wyrmwood

このテストは、 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
10
samwyse

Pythonではcatchexcept と呼ばれています。それ以外は、そのような単純な場合には問題ありません。オブジェクトに属性があるかどうかを確認するために使用できる AttributeError があります。

7
SilentGhost

JSON/Dictにキーが存在するかどうかを確認することは、前回の回答に追加されたものです。

'Json/Dictオブジェクト名' .has_key( 'キー名')

これはTrueまたはFalseを返します

5

このような状況に対処するためによく機能する方法は、変数が存在するかどうかを明示的にチェックせずに、先に進み、存在しない可能性のある変数の最初の使用法を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
  ...
5
Roger Dahl