问题:如何检查变量是否存在?
我想检查一个变量是否存在。现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
是否有其他方法无一exceptions?
回答 0
要检查是否存在局部变量:
if 'myVar' in locals():
# myVar exists.
要检查是否存在全局变量:
if 'myVar' in globals():
# myVar exists.
要检查对象是否具有属性:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
回答 1
在使用中那些尚未被定义或组(或明或暗地)变量几乎总是一件坏事任何语言,因为这往往预示着该计划的逻辑还没有被恰当地考虑,并有可能的结果行为无法预测。
如果您需要在Python中执行此操作,以下与您的操作类似的技巧将确保变量在使用前具有一定的价值:
try:
myVar
except NameError:
myVar = None
# Now you're free to use myVar without Python complaining.
但是,我仍然不认为这是个好主意-在我看来,您应该尝试重构代码,以免发生这种情况。
回答 2
一种简单的方法是一开始就初始化它 myVar = None
然后稍后:
if myVar is not None:
# Do something
回答 3
使用try / except是测试变量是否存在的最佳方法。但是几乎可以肯定,有一种比设置/测试全局变量更好的方法。
例如,如果您想在第一次调用某个函数时初始化模块级变量,那么最好使用如下代码:
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
回答 4
对于对象/模块,您还可以
'var' in dir(obj)
例如,
>>> class Something(object):
... pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
回答 5
我将假定该测试将在功能中使用,类似于user97370的答案。我不喜欢这个答案,因为它污染了全局命名空间。解决该问题的一种方法是改用类:
class InitMyVariable(object):
my_variable = None
def __call__(self):
if self.my_variable is None:
self.my_variable = ...
我不喜欢这样,因为它使代码复杂化,并提出了一些问题,例如,是否应该确认Singleton编程模式?幸运的是,Python允许函数在一段时间内拥有属性,这为我们提供了一个简单的解决方案:
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
回答 6
catch
except
在Python中被称为。除此之外,对于这种简单情况也很好。还有的AttributeError
,可以用来检查一个对象具有的属性。
回答 7
处理这种情况的一种通常有效的方法是不显式检查变量是否存在,而只是继续将可能不存在的变量的首次用法包装在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
...
回答 8
我创建了一个自定义函数。
def exists(var):
var_exists = var in locals() or var in globals()
return var_exists
然后调用如下函数,将其替换variable_name
为要检查的变量:
exists("variable_name")
将返回True
或False