我想检查一个变量是否存在。现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
是否有其他方法无一例外?
myVar
真的很复杂,需要花费很长时间来进行生产/评估,那么try
慢下来的事情就不会了吗?
exec
或元类做一些疯狂的事情,那也不会太昂贵。
我想检查一个变量是否存在。现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
是否有其他方法无一例外?
myVar
真的很复杂,需要花费很长时间来进行生产/评估,那么try
慢下来的事情就不会了吗?
exec
或元类做一些疯狂的事情,那也不会太昂贵。
Answers:
要检查是否存在局部变量:
if 'myVar' in locals():
# myVar exists.
要检查是否存在全局变量:
if 'myVar' in globals():
# myVar exists.
要检查对象是否具有属性:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
NameError
。
if hasattr(obj, 'attr_name'):
适合班级的作品:即if hasattr(self, 'attr_name'):
在使用中那些尚未被定义或组(或明或暗地)变量几乎总是一件坏事任何语言,因为这往往预示着该计划的逻辑还没有被恰当地考虑,并有可能的结果行为无法预测。
如果您需要在Python中执行此操作,以下与您的操作类似的技巧将确保变量在使用前具有一定的价值:
try:
myVar
except NameError:
myVar = None
# Now you're free to use myVar without Python complaining.
但是,我仍然不认为这是个好主意-在我看来,您应该尝试重构代码,以免发生这种情况。
一种简单的方法是一开始就初始化它 myVar = None
然后稍后:
if myVar is not None:
# Do something
myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
except
声明
if myVar: # Do something
避免了阅读双重否定
myVar
一个空列表,零,空字符串等条件都为真,所以也是如此。–
if myVar: # Do something
抛出NameError
python3
使用try / except是测试变量是否存在的最佳方法。但是几乎可以肯定,有一种比设置/测试全局变量更好的方法。
例如,如果您想在第一次调用某个函数时初始化模块级变量,那么最好使用如下代码:
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
我将假定该测试将在功能中使用,类似于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
catch
except
在Python中被称为。除此之外,对于这种简单情况也很好。还有的AttributeError
,可以用来检查一个对象具有的属性。