检查多个变量的 None 并分配第一个不是 None 的变量

时间:2021-08-01 22:25:54

标签: python

有没有办法改进这段代码以使其更短?

if date_a is None and date_b is None and date_c is None: 
    start_date = current_date
else:
    if date_a is not None:
        start_date = date_a
    elif date_b is not None:
        start_date = date_b
    elif date_c is not None:
        start_date = date_c

4 个答案:

答案 0 :(得分:1)

您可以使用 or,它将为您提供第一个真值:

start_date = date_a or date_b or date_c or current_date

另一种解决方案是将它们转换为可迭代对象,添加一个 is None 过滤器,然后使用 next() 拉出第一项:

start_date = next(date for date in (
    date_a, 
    date_b, 
    date_c, 
    current_date
) if date is not None)

如果您需要“真实性”以外的条件,或者您有很多值(在这种情况下,将它们组织在可迭代容器中可能比将它们粘贴到长 or顺序)。

答案 1 :(得分:1)

首先,您可以删除一个 if/else 深度:

if date_a is not None:
    start_date = date_a
elif date_b is not None:
    start_date = date_b
elif date_c is not None:
    start_date = date_c
else:
    start_date = current_date

您还可以利用 for...else 语句:

for start_date in (date_a, date_b, date_c):
    if start_date is not None:
        break
else:
    start_date = current_date

else 仅在没有触发 break 条件时发生,例如如果所有潜在的 start_date 都是 None

答案 2 :(得分:1)

作为 Python >= 3.8 的替代方案,您可以使用 assignment expressionany()

any(start_date := d for d in (date_a, date_b, date_c, current_date))

在您的具体情况下,我怀疑 or 链会更快,但是如果您有一组变量而不仅仅是具有不同名称的单个变量,any() 也可以很好地工作:

any(start_date := d for d in dates)

any 的返回值会让你知道是否有一些真值。

答案 3 :(得分:0)

可以执行以下操作:

start_date = date_a or date_b or date_c or current_date

或者,确实没有任何问题:

if date_a is not None:
    start_date = date_a
elif date_b is not None:
    start_date = date_b
elif date_c is not None:
    start_date = date_c
else:
    start_date = current_date