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

try:
    myVar
except NameError:
    # Do something.

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


当前回答

一种简单的方法是在初始化时输入myVar = None

后来:

if myVar is not None:
    # Do something

其他回答

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

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

my_variable = None

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

对象也可以使用__dict__。

class A(object):
    def __init__(self):
        self.m = 1

a = A()
assert "m" in a.__dict__
assert "k" not in a.__dict__

一种简单的方法是在初始化时输入myVar = None

后来:

if myVar is not None:
    # Do something

我将假设测试将用于一个函数中,类似于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

处理这种情况的一种方法通常是不显式检查变量是否存在,而是直接将可能不存在的变量的第一次使用包装在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
  ...