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

3 投票
3 回答
736 浏览
提问于 2025-04-17 02:18

假设我有以下的Python代码

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

这里的obj是一个Python对象,但它的类定义没有包含在内。

我记得好像有一种更简洁的写法(就像一行代码那样?)也可以实现相同的功能。如果我没有在做梦的话,有人能告诉我那种更简单的写法是什么吗?谢谢。

3 个回答

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]
2

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。

比如说,你可能希望程序在用户输入一个特定的数字时才执行某个功能。如果用户输入的数字不对,程序就会停下来,或者给出一个提示,告诉用户输入有误。

这种情况通常会用到“条件语句”,它们就像是程序的判断依据,帮助程序决定下一步该做什么。

总之,条件语句让程序变得更聪明,能够根据不同的情况做出不同的反应。

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

这段代码的意思是……

首先,它做了什么……

接下来,它又执行了什么操作……

最后,结果会是……

总的来说,这段代码的作用是……

如果你对某个部分不太明白,可以随时问我!

identifier = None if obj is None else obj.id

撰写回答