我正在尝试创建一个带有可选参数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.")
但是在“通过”末尾出现语法错误。
解决这个问题的正确方法是什么?
答案 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)*