有没有办法改进这段代码以使其更短?
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
答案 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 expression 加 any()
:
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