Каков правильный синтаксис оператора Walrus с тернарным оператором?

Если посмотреть на Python-Dev и Stackru, эквивалент тернарного оператора Python:

a if condition else b

Глядя на PEP-572 и Stackru, я понимаю, что такое оператор 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.

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

2 ответа

Решение

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

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

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

Для тех, кто ищет короткий ответ, так как большинство программистов работают быстро или просто не могут быстро понять принятый ответ, как это сделал я:

      >>> variable = foo if (foo := 'put parentheses here!') else 'otherwise'
>>> variable
put parentheses here!
Другие вопросы по тегам