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

可能需要这样做的一种可能情况:

如果您使用finally块来关闭连接但在try块中,则程序sys.exit()在定义连接之前退出。在这种情况下,finally将调用该块并且连接关闭语句将失败,因为没有创建连接。

于 2011-12-28T14:20:36.247 回答