python:如何检查变量是否存在?

我想检查变量是否存在。现在我这样做:

1
2
3
4
try:
   myVar
except NameError:
   # Do something.

还有其他没有例外的方法吗?


检查局部变量是否存在:

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

检查全局变量是否存在:

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

检查对象是否有属性:

1
2
if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.


在任何语言中,使用尚未定义或设置(隐式或显式)的变量几乎都是一件坏事,因为它表明程序的逻辑没有得到正确的考虑,并且可能导致不可预测的行为。

下面的技巧和你的很相似,可以确保变量在使用前有一定的值:

1
2
3
4
5
try:
    myVar
except NameError:
    myVar = None
# Now you're free to use myVar without Python complaining.

然而,我仍然不认为这是一个好主意——在我看来,您应该重构代码,这样才不会出现这种情况。


一种简单的方法是首先用myVar = None初始化它

之后:

1
2
if myVar is not None:
    # Do something


使用try/except是测试变量是否存在的最好方法。但是几乎可以肯定,有比设置/测试全局变量更好的方法。

例如,如果您想在第一次调用某个函数时初始化模块级变量,那么最好编写这样的代码:

1
2
3
4
5
6
my_variable = None

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


对于对象/模块,也可以

1
'var' in dir(obj)

例如,

1
2
3
4
5
6
7
8
9
>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False

我将假设这个测试将在一个函数中使用,类似于user97370的答案。我不喜欢这个答案,因为它会污染全局名称空间。修复它的一种方法是使用一个类:

1
2
3
4
5
6
class InitMyVariable(object):
  my_variable = None

def __call__(self):
  if self.my_variable is None:
   self.my_variable = ...

我不喜欢这样做,因为这样会使代码变得复杂,并引发一些问题,比如,这是否应该与单例编程模式相一致?幸运的是,Python允许函数有属性已经有一段时间了,这给了我们一个简单的解决方案:

1
2
3
4
def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None


在Python中,catch被称为except。除此之外,对于这种简单的情况也可以。可以使用AttributeError检查对象是否具有属性。


它只是对前面的答案的一个补充,用于检查键是否以JSON/Dict的形式出现在python中

"Json / Dict对象名称"。has_key(密钥名)

这将返回True或False


一种处理这种情况的好方法是不显式地检查变量是否存在,而是直接在try/except NameError中封装可能不存在的变量的第一个用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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
  ...