是否存在C#null的Python等价物

在C#中有一个空合并运算符(写为?? ),它允许在赋值过程中进行简单的(短)空检查:

string s = null;
var other = s ?? "some default value";

有没有一个python等价物?

我知道我可以这样做:

s = None
other = s if s else "some default value"

但有没有更短的路(我不需要重复s )?


other = s or "some default value"

好吧,必须澄清如何or操作员的工作。 它是一个布尔运算符,因此它在布尔上下文中工作。 如果这些值不是布尔值,则为了操作员的目的将它们转换为布尔值。

请注意, or运算符不会只返回TrueFalse 。 相反,如果第一个操作数的计算结果为true,则返回第一个操作数;如果第一个操作数的计算结果为false,则返回第二个操作数。

在这种情况下,表达式x or y返回值为True返回x ,或者在转换为布尔值时返回true。 否则,它返回y 。 对于大多数情况,这将用于C♯的空合并运算符的相同目的,但请记住:

42    or "something"    # returns 42
0     or "something"    # returns "something"
None  or "something"    # returns "something"
False or "something"    # returns "something"
""    or "something"    # returns "something"

如果使用变量s来保存某个对类的实例或None的引用(只要你的类没有定义成员__nonzero__()__len__() ),那么使用相同的语义是安全的空合并运算符。

事实上,Python的这种副作用甚至可能是有用的。 由于您知道什么值的计算结果为false,因此您可以使用它来触发默认值,而无需专门使用“ None (例如,错误对象)。

在某些语言中,这种行为被称为Elvis算子。


严格,

other = s if s is not None else "default value"

否则s = False将变成“默认值”,这可能不是预期的。

如果你想让这个更短,尝试

def notNone(s,d):
    if s is None:
        return d
    else:
        return s

other = notNone(s, "default value")

这是一个函数,它将返回非None的第一个参数:

def coalesce(*arg):
  return reduce(lambda x, y: x if x is not None else y, arg)

# Prints "banana"
print coalesce(None, "banana", "phone", None)

即使第一个参数不是None,reduce()可能会不必要地遍历所有参数,因此您也可以使用此版本:

def coalesce(*arg):
  for el in arg:
    if el is not None:
      return el
  return None
链接地址: http://www.djcxy.com/p/57971.html

上一篇: Is there a Python equivalent of the C# null

下一篇: Unique ways to use the Null Coalescing operator