Как использовать лямбду в качестве аргумента по умолчанию? - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь создать функцию, которая будет принимать необязательный параметр callback, который должен быть функцией.

Я бы хотел, чтобы значением по умолчанию для этой функции было ничто, то есть функция, которая ничего не делает. Мне кажется, что это имеет смысл:

do_the_thing()
do_the_thing(callback = print) # or message.respond, or log_to_file, etc

def do_the_thing(**kwargs):
    cb = kwargs.get('callback', lambda x: pass)
    # do things
    cb("Things have been done.")

Но я получаю синтаксическую ошибку в конце "pass".

Как правильно это сделать?

1 Ответ

4 голосов
/ 16 июня 2019

Питоны lambda более ограничены, чем обычные def функции. Обычно lambda требует выражения в теле ... но pass это просто утверждение. Таким образом, очевидным решением было бы использовать:

lambda x: None  # or since you don't use x "lambda _: None"

Практическое правило: все, что может быть присвоено переменной, также может находиться в теле lambda. Вы можете узнать больше о грамматике в Справочник по языку Python

6.13. Lambdas

lambda_expr        ::=  "lambda" [parameter_list] ":" expression
lambda_expr_nocond ::=  "lambda" [parameter_list] ":" expression_nocond

и аналогичные для pass

7. Simple statements

simple_stmt ::=  expression_stmt
[...]
                 | pass_stmt
[...]

pass_stmt ::=  "pass"

Или в более формальной полной спецификации грамматики . Здесь вы можете использовать любой test для присвоения и лямбда-тела, а test может быть expr. Вот (серьезно) короткая часть:

pass_stmt: 'pass'

annassign: ':' test ['=' test]
lambdef: 'lambda' [varargslist] ':' test

test: or_test ['if' or_test 'else' test] | lambdef
or_test: and_test ('or' and_test)*
and_test: not_test ('and' not_test)*
not_test: 'not' not_test | comparison
comparison: expr (comp_op expr)*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...