Каков правильный синтаксис оператора Walrus с тернарным оператором? - PullRequest
0 голосов
/ 06 августа 2020

Глядя на Python -Dev и StackOverflow , эквивалент тернарного оператора Python:

a if condition else b

Глядя на PEP -572 и StackOverflow , я понимаю, что такое оператор Walrus:

:=

Теперь я пытаюсь объединить "назначение оператора моржа" и "условную проверку тернарного оператора" "в один оператор, например:

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.

Мой вопрос: Каков правильный синтаксис для встраивания оператора моржа в тернарный оператор?

1 Ответ

5 голосов
/ 06 августа 2020

Синтаксически вам просто не хватает пары скобок.

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:

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

Это означает, что := не может использоваться в условном выражении, если оно не встречается внутри вложенного выражения.

...