检查变量是否为None

38 投票
3 回答
23953 浏览
提问于 2025-04-16 20:51

我最近需要检查一下有没有变量没有被初始化(它们的默认值是 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

撰写回答