Python:访问NoneType对象时更简洁的变量赋值语法

3

假设我有以下Python代码:

if obj is None:
  identifier = None
else:
  identifier = obj.id

其中obj是一个Python对象,其类定义未包含在内。

我模糊地记得有一种更简洁的语法(像一行代码?)可以实现相同的功能。如果我没有做梦,有人能否请教一下那个更简单的语法是什么?谢谢。


搜索和教程都没有帮到你吗? - S.Lott
一般来说是个好问题,但我不确定该如何搜索,你呢? - Tom Zych
@S.Lott - 我尝试搜索答案,但没有找到。这就是为什么我要发布问题的原因。 - tamakisquare
1
相关:https://dev59.com/hVDTa4cB1Zd3GeqPGiTQ,https://dev59.com/1XRA5IYBdhLWcg3w9ivq。 - S.Lott
3个回答

8
identifier = None if obj is None else obj.id

Python的条件表达式来拯救! - jathanism
2
现在只是化妆品:identifier = obj.id if obj else None - fgeller
@fgeller:不,如果obj是0,这将把它设置为“None”。identifier = obj.id if obj is not None else None可以工作,但似乎过于冗长。 - Tom Zych
1
@TomZych 嗯,这有点取决于你对 obj 的了解程度 :) - fgeller

2
identifier = getattr(obj, "id", None)

1
请注意,这将在obj上没有这样的属性时使用None,而不仅仅是当obj is None时。 - user395760
@delnan - 谢谢,你的评论让我意识到我实际上误读了问题。Tom Zych的答案对于OP所问的是正确的。 - Andrew Clark

1

如果您使用的是没有条件表达式的旧版Python,您可以借助布尔表达式的求值语义:布尔表达式的值是决定其最终值的术语在表达式中的值。这听起来相当抽象,但在您的情况下,您可以这样说:

((obj is None and [None]) or [obj.id])[0]

如果objNone,那么您就会。
((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]

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