480

実行時にコードの特定の場所に変数が設定されているかどうかをどのように知ることができますか?(1)変数を条件付きで設定でき、(2)変数を条件付きで削除できるため、これは必ずしも明白ではありません。defined()Perl isset()、PHP defined?、Rubyのようなものを探しています。

if condition:
    a = 42

# is "a" defined here?

if other_condition:
    del a

# is "a" defined here?
4

6 に答える 6

721
try:
    thevariable
except NameError:
    print("well, it WASN'T defined after all!")
else:
    print("sure, it was defined.")
于 2009-10-20T05:07:13.337 に答える
420

'a' in vars() or 'a' in globals()

衒学者になりたい場合は、ビルトインもチェックできます
'a' in vars(__builtins__)

于 2009-10-20T05:08:28.357 に答える
151

避けたほうがいいと思います。書く方がよりクリーンで明確です:

a = None
if condition:
    a = 42
于 2009-10-20T05:15:44.100 に答える
22
try:
    a # does a exist in the current namespace
except NameError:
    a = 10 # nope
于 2009-10-20T05:06:51.523 に答える
5

この特定のケースでは、のa = None代わりに実行することをお勧めしますdel a。これにより、割り当てられたオブジェクトへの参照カウントがデクリメントされ、が定義されてaいない場合でも失敗しません。aこのdelステートメントはオブジェクトのデストラクタを直接呼び出すのではなく、変数からバインドを解除することに注意してください。参照カウントがゼロになると、オブジェクトのデストラクタが呼び出されます。

于 2009-10-20T06:30:24.053 に答える
5

これが必要になる可能性のある1つの状況:

ブロックを使用しfinallyて接続を閉じているが、tryブロック内にある場合、プログラムsys.exit()は接続が定義される前に終了します。この場合、finally接続が作成されていないため、ブロックが呼び出され、接続を閉じるステートメントは失敗します。

于 2011-12-28T14:20:36.247 に答える