【问题标题】:Python: A more concise syntax for variable assignment when accessing a NoneType objectPython:访问 NoneType 对象时变量赋值的更简洁语法
【发布时间】:2011-11-17 07:31:48
【问题描述】:

说,我有以下 Python 代码

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

其中obj 是一个不包含类定义的 Python 对象

我几乎不记得有更简洁的语法(比如单行代码?)可以达到同样的效果。如果我不是在做梦,有人可以告诉我那个更简单的语法可能是什么吗?谢谢。

【问题讨论】:

标签: python


【解决方案1】:
identifier = None if obj is None else obj.id

【讨论】:

  • Python 的条件表达式来救援!
  • 现在只是化妆品:identifier = obj.id if obj else None
  • @fgeller:不,如果 obj 为 0,这会将其设置为 Noneidentifier = obj.id if obj is not None else None 有效,但似乎不必要地冗长。
  • @TomZych 好吧,这取决于你对 obj 的了解 :)
【解决方案2】:
identifier = getattr(obj, "id", None)

【讨论】:

  • 请注意,只要obj 上没有这样的属性,这将使用None,而不仅仅是obj is None
  • @delnan - 谢谢,您的评论让我意识到我实际上误读了这个问题。 Tom Zych 的回答对于 OP 的要求是正确的。
【解决方案3】:

如果您使用没有条件表达式的旧 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 值,可以使用任何表达式进行ored,而无需更改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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多