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

13

通过查看Python-DevStackOverflow,Python的三元运算符等效语法为:

a if condition else b

通过查看PEP-572StackOverflow,我了解了什么是海象运算符:

:=

现在我正在尝试将“海象运算符的赋值”和“三元运算符的条件检查”合并到一个语句中,类似于:

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。

我的问题是如何在三元运算符中嵌入海象运算符的正确语法?

2个回答

21

从语法上来说,你只是缺少一对括号。

do_something(list_of_roles) if (list_of_roles := get_role_list(username)) else "Role list is [] empty"
如果您查看语法,:= 被定义为高级 namedexpr_test 结构的一部分:
namedexpr_test: test [':=' test]

当条件表达式是一种 测试 时:

test: or_test ['if' or_test 'else' test] | lambdef
这意味着 := 不能在条件表达式中使用,除非它出现在嵌套表达式内部。

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


7
有疑问时,加上一些括号是一个我在多年中发现非常有用的规则。 - Mark Ransom

11

对于那些寻求简短回答或类似我一样不易理解被接受答案的人:

>>> variable = foo if (foo := 'parentheses!!') else 'otherwise'
>>> #                 ▲                      ▲
>>> #                 ╰──────────────────────╯
>>> variable
parentheses!!

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