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

try:
    myVar
except NameError:
    # Do something.

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


当前回答

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

后来:

if myVar is not None:
    # Do something

其他回答

catch被调用,除非在Python中。除此之外,对于这种简单的情况,它是可以接受的。AttributeError可以用来检查对象是否有属性。

对象也可以使用__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

像这样:

def no(var):
    "give var as a string (quote it like 'var')"
    assert(var not in vars())
    assert(var not in globals())
    assert(var not in vars(__builtins__))
    import keyword
    assert(var not in keyword.kwlist)

之后:

no('foo')
foo = ....

如果你的新变量foo使用起来不安全,你会得到一个AssertionError异常,它会指向失败的行,然后你就知道了。 这是一个明显做作的自我指涉:

no('no')

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-88-d14ecc6b025a> in <module>
----> 1 no('no')

<ipython-input-86-888a9df72be0> in no(var)
      2     "give var as a string (quote it)"
      3     assert( var not in vars())
----> 4     assert( var not in globals())
      5     assert( var not in vars(__builtins__))
      6     import keyword

AssertionError: 

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

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

my_variable = None

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