海象运算符和三元运算符的正确语法是什么?

What is the correct syntax for Walrus operator with ternary operator?

查看 Python-Dev and Whosebug,Python 的三元运算符等效为:

a if condition else b

看了PEP-572 and Whosebug,明白了什么是海象算子:

:=

现在我试图将“海象运算符的赋值”和“三元运算符的条件检查”组合成一个语句,例如:

other_func(a) if (a := some_func(some_input)) else b

例如,请考虑以下代码段:

do_something(list_of_roles) if list_of_roles := get_role_list(username) else "Role list is [] empty"

我没能完全理解语法。尝试过各种组合后,每次解释器都会抛出 SyntaxError: invalid syntax。我的 python 版本是 3.8.3.

我的问题是将海象运算符嵌入三元运算符的正确语法是什么?

从语法上讲,您只是少了一对括号。

do_something(list_of_roles) if (list_of_roles := get_role_list(username)) else "Role list is [] empty"

如果您查看语法,:= 被定义为 high-level namedexpr_test 结构的一部分:

namedexpr_test: test [':=' test]

而条件表达式是一种 test:

test: or_test ['if' or_test 'else' test] | lambdef

这意味着 := 不能用于 条件表达式中,除非它出现在嵌套表达式中。

对于寻找简短答案的人来说,因为大多数程序员 运行 很快,或者像我一样无法快速掌握已接受的答案:

>>> variable = foo if (foo := 'put parentheses here!') else 'otherwise'
>>> variable
put parentheses here!