假设我有以下Python代码:
if obj is None:
identifier = None
else:
identifier = obj.id
其中obj
是一个Python对象,其类定义未包含在内。
我模糊地记得有一种更简洁的语法(像一行代码?)可以实现相同的功能。如果我没有做梦,有人能否请教一下那个更简单的语法是什么?谢谢。
假设我有以下Python代码:
if obj is None:
identifier = None
else:
identifier = obj.id
其中obj
是一个Python对象,其类定义未包含在内。
我模糊地记得有一种更简洁的语法(像一行代码?)可以实现相同的功能。如果我没有做梦,有人能否请教一下那个更简单的语法是什么?谢谢。
identifier = None if obj is None else obj.id
identifier = obj.id if obj else None
- fgelleridentifier = obj.id if obj is not None else None
可以工作,但似乎过于冗长。 - Tom Zychidentifier = getattr(obj, "id", None)
obj
上没有这样的属性时使用None
,而不仅仅是当obj is None
时。 - user395760如果您使用的是没有条件表达式的旧版Python,您可以借助布尔表达式的求值语义:布尔表达式的值是决定其最终值的术语在表达式中的值。这听起来相当抽象,但在您的情况下,您可以这样说:
((obj is None and [None]) or [obj.id])[0]
obj
是None
,那么您就会。((True and [None]) or [obj.id])[0]
这是
([None] or [obj.id])[0]
由于[None]
表示一个True
值,可以与任何表达式进行or
运算而不改变or
表达式的值,结果是[None][0]
,即None
如果obj
不是None
,则您有
((False and [None]) or [obj.id])[0]
这是
(False or [obj.id])[0]
= ([obj.id])[0]
= obj.id
在以前的时候,模拟三元运算符即“条件if表达式”是这样的。
通用模式a if b else c
与以下相同:
(b and [a] or [c])[0]