Python: 访问NoneType对象时更简洁的变量赋值语法
假设我有以下的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]
如果 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]
2
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。
比如说,你可能希望程序在用户输入一个特定的数字时才执行某个功能。如果用户输入的数字不对,程序就会停下来,或者给出一个提示,告诉用户输入有误。
这种情况通常会用到“条件语句”,它们就像是程序的判断依据,帮助程序决定下一步该做什么。
总之,条件语句让程序变得更聪明,能够根据不同的情况做出不同的反应。
identifier = getattr(obj, "id", None)
8
这段代码的意思是……
首先,它做了什么……
接下来,它又执行了什么操作……
最后,结果会是……
总的来说,这段代码的作用是……
如果你对某个部分不太明白,可以随时问我!
identifier = None if obj is None else obj.id