変数が存在するかどうかを確認したい。今私はこのようなことをしています:
try:
myVar
except NameError:
# Do something.
例外なく他の方法はありますか?
myVar
本当に複雑なものである場合、生成/評価に長い時間がかかりますが、try
遅くなることはありませんか?
exec
メタクラスでクレイジーなことをしているとしたら、本当に奇妙なケースは別として、それは高くつくことはありません。
変数が存在するかどうかを確認したい。今私はこのようなことをしています:
try:
myVar
except NameError:
# Do something.
例外なく他の方法はありますか?
myVar
本当に複雑なものである場合、生成/評価に長い時間がかかりますが、try
遅くなることはありませんか?
exec
メタクラスでクレイジーなことをしているとしたら、本当に奇妙なケースは別として、それは高くつくことはありません。
回答:
ローカル変数の存在を確認するには:
if 'myVar' in locals():
# myVar exists.
グローバル変数の存在を確認するには:
if 'myVar' in globals():
# myVar exists.
オブジェクトに属性があるかどうかを確認するには:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
NameError
。
if hasattr(obj, 'attr_name'):
クラスで機能するものが好きでした:ieif hasattr(self, 'attr_name'):
(暗黙的または明示的に)まだ定義または設定されていない変数の使用は、プログラムのロジックが適切に検討されていないことを示し、結果が生じる可能性が高いため、ほとんどの場合、どの言語でも悪いことです予測不可能な動作で。
Pythonでそれを行う必要がある場合、次のトリックはあなたのものと同様であり、使用前に変数に何らかの値があることを確認します。
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
myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
except
ステートメントでNoneに設定しているので、これがとても好きです
if myVar: # Do something
これは二重否定を読む必要性を回避する
myVar
空のリスト、ゼロ、空の文字列などであっても、この条件を真にしたいので
if myVar: # Do something
はNameError
、myVarが宣言されていない場合、python3でスローします
変数の存在をテストする最良の方法は、try / exceptを使用することです。しかし、ほぼ確実に、グローバル変数を設定/テストするよりも、あなたがしていることを何でも行うより良い方法があります。
たとえば、ある関数を初めて呼び出すときにモジュールレベルの変数を初期化する場合は、次のようなコードを使用することをお勧めします。
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
テストは、user97370の回答と同様に、関数で使用されることを想定しています。グローバルな名前空間を汚染するので、私はその答えは好きではありません。これを修正する1つの方法は、代わりにクラスを使用することです。
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
catch
except
Python で呼び出されます。それ以外は、そのような単純なケースでは問題ありません。ありますAttributeError
オブジェクトが属性を持っているかどうかを確認するために使用することができます。
この種の状況を処理するためによく機能する方法は、変数が存在するかどうかを明示的にチェックせずに、存在しない可能性のある変数の最初の使用を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
...
カスタム関数を作成しました。
def exists(var):
var_exists = var in locals() or var in globals()
return var_exists
次に、次のような関数を呼び出して、variable_name
確認する変数に置き換えます。
exists("variable_name")
戻るTrue
かFalse
locals()
... ERR ...関数に対してローカルですexists
😅