检查变量是否为None
我最近需要检查一下有没有变量没有被初始化(它们的默认值是 None
)。于是我想出了这个方法:
if None in (var1, var2, var3):
error_out()
在我看来,这个方法差不多可以算是挺不错的,但我在想——这样做算不算好呢?这是唯一的做法吗?有没有可能在某些情况下会出现意想不到的结果呢?
3 个回答
12
还有一种稍微不同的方法,就是使用内置的all
方法。不过要注意,这个方法也会把一些“假”的值,比如0
或者""
(空字符串),算进去,这可能不是你想要的结果:
>>> all([1, 2, 3])
True
>>> all([None, 1, 2])
False
>>> all([0, 1])
False
13
让我在这里发表一下我的看法:
>>> any(a is None for a in [1,0])
False
>>> any(a is None for a in [1,0, None])
True
所以可以这样做:
def checkNone(*args):
if any(arg is None for arg in args):
error_out()
这里没有什么新鲜的。只是我个人觉得,any arg is None
这部分可能更容易理解。
13
首先,你的代码是有效的,易读且简洁……所以这可能不是唯一的做法(编程习惯会随着时间和新语言特性的出现而变化),但它绝对是一种符合Python风格的做法。
其次,有两个观察点:
在Python中,生成错误的标准方式是抛出异常。当然,你可以把抛出异常的代码放在一个函数里,但因为这种做法比较少见,我在想你是不是出于某种特定原因选择了这种设计。你可以自己写一个异常类,甚至像记录错误信息到文件这样的基础代码也可以放在这个类里,而不是放在包裹的函数中。
你写的测试方式使得你无法将None
作为变量的值。现在这可能不是问题,但将来可能会限制你的灵活性。检查变量是否初始化的另一种方法是不给相关变量声明初始值,然后可以做类似下面的事情:
try:
self.variable_name
except NameError:
# here the code that runs if the variable hasn't been initialised
finally:
# [optional] here the code that should run in either case