我想检查变量是否存在。现在我在做这样的事情:
try:
myVar
except NameError:
# Do something.
有没有其他没有例外的方法?
我想检查变量是否存在。现在我在做这样的事情:
try:
myVar
except NameError:
# Do something.
有没有其他没有例外的方法?
当前回答
简短的变体:
my_var = some_value if 'my_var' not in globals() else my_var:
其他回答
对于对象/模块,也可以
'var' in dir(obj)
例如,
>>> class Something(object):
... pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
我将假设测试将用于一个函数中,类似于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
我创建了一个自定义函数。
def exists(var):
return var in globals()
然后调用函数,将variable_name替换为你想检查的变量:
exists("variable_name")
将返回True或False
它可能不是高性能的,但您将解决方案泛化为一个同时检查局部变量和全局变量的函数。
import inspect
def exists_var(var_name):
frame = inspect.currentframe()
try:
return var_name in frame.f_back.f_locals or var_name in globals()
finally:
del frame
然后你可以这样使用它:
exists_var('myVar')
catch被调用,除非在Python中。除此之外,对于这种简单的情况,它是可以接受的。AttributeError可以用来检查对象是否有属性。