Python中类似于MySQL的IFNULL函数的等效函数

16

Python 中是否有一个函数,可以检查返回的值是否为 None,并且如果是,则允许你将其设置为另一个值,类似于 MySQL 中的 IFNULL 函数?

8个回答

32

如果你想将所有“falsy”值(即None0""[]False等)转换为特定的值,并让其他所有值不变,你可以使用or。例如:

print (x or default_value)

如果 x 的值为真,它将打印出 x 的值;如果 x 的值为假,则打印出default_value的值。

我之所以提到这一点,是因为在数据库中,IFNULL 经常用于清理布尔和数字列中的空值,因此可能是你或其他人想要的内容。显然,如果您想将 None0False 等区分对待,那么这种方法就不起作用。


这是一个更好的解决方案,适用于那些不想评估两次或将其保存到临时变量中的人。 - Addison
1
是的,正如您上面提到的,如果您确定x是正数或None,则此方法才有效。否则,负数x或0也将返回默认值。 - Harry Duong
@HarryDuong 负数不是 False。只有零是 False - Anonymous

16

其实不行,因为你无法重新绑定参数。

if foo is None:
  foo = 42
或者
def ifnull(var, val):
  if var is None:
    return val
  return var

foo = ifnull(foo, 42)

3
ifnull()的语句体可以简写为val if var is None else var - S.Lott
3
实际上可以把它缩短为 return var or val - Ionut Hulub
6
不行,因为许多非“None”的值是假的。 - Ignacio Vazquez-Abrams

12

像这样:

x = SOME_VALUE if x is None else x

1

nvl(v1,v2) 会返回 v1,如果不为 null,则返回 v2

nvl = lambda a,b: a or b


a 也可以是 0[]{}()''。对于所有这些情况,都将返回 b - TrueY

0
我们制作了这个:
def d_nvl(d,key,default_val):
    try:
        return d[key]
    except Exception:
        return default_val

它的使用方式如下: my_val = d_nvl(my_dict,'my_key','default_val')


0

来自MySQL:

nvl(foo, bar) [or even nvl2(foo, baz, bar) in Oracle]

在lambda函数中使用Python三元运算符(详见此处):

nvl = lambda foo, bar: bar if foo is None else foo

nvl2 = lambda foo, baz, bar: bar if foo is None else baz


foo = nvl(foo, 42) # returns 42 if foo is null

foo = nvl2(foo, 7, 42) # returns 42 if foo is null or 7 is foo is not null

-1

我正在使用SQL Oracle,它有NVL()函数可以替换null。例如,NVL(null,1)返回1,NVL(3,1)返回3。相应的Python函数为:

import numpy as np

nvl = lambda a,b: b if np.isnan(a) else a

nvl(3,1)
>>> 3
nvl(np.nan,1)
>>> 1

2
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。请尽量不要在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - Filnor

-2

由于这个问题已经超过2年了,我猜这更多是为了未来的参考 :)

我喜欢做的是 max('', mightBeNoneVar) 或者 max(0, mightBeNoneVar)(取决于上下文)。

更详细的例子:
print max('', col1).ljust(width1) + ' ==> '+ max('', col2).ljust(width2)


对我来说看起来有点复杂,值得注意的是,虽然这样的比较在2.x中有效,在Python 3.x中,NoneType不可排序,因此会出现TypeError - Jon Clements

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接