如何使用 lambda 作为默认参数?

sna*_*che 3 python lambda syntax-error python-3.x

我正在尝试创建一个带有可选参数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.")
Run Code Online (Sandbox Code Playgroud)

但是在“pass”结束时出现语法错误。

解决这个问题的正确方法是什么?

MSe*_*ert 5

Pythonlambda比普通def函数更受限制。通常lambda在正文中需要一个表达式……但pass只是一个语句。所以显而易见的解决方案是使用:

lambda x: None  # or since you don't use x "lambda _: None"
Run Code Online (Sandbox Code Playgroud)

根据经验:可以分配给变量的所有内容也可以在lambda. 您可以在The Python Language Reference 中找到有关语法的更多信息

6.13. Lambdas

lambda_expr        ::=  "lambda" [parameter_list] ":" expression
lambda_expr_nocond ::=  "lambda" [parameter_list] ":" expression_nocond
Run Code Online (Sandbox Code Playgroud)

和类似的 pass

7. Simple statements

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

pass_stmt ::=  "pass"
Run Code Online (Sandbox Code Playgroud)

或者在更正式的Full Grammar 规范中。在这里,您可以将 anytest用于赋值和 lambda 主体,并且 atest可以是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)*
Run Code Online (Sandbox Code Playgroud)