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

时间:2019-06-15 23:53:06

标签: python python-3.x lambda syntax-error

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

但是在“通过”末尾出现语法错误。

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

1 个答案:

答案 0 :(得分:4)

Python lambda比普通def函数的限制更多。通常lambda要求在主体中有一个表达式...但是pass只是一个语句。因此,显而易见的解决方案是使用:

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

根据经验:可以分配给变量的所有内容也可以位于lambda的正文中。您可以在The Python Language Reference

中找到有关语法的更多信息。
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"

或更正式的Full Grammar specification中。在这里,您可以使用任何test进行赋值和lambda正文,而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)*
相关问题