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”结束时出现语法错误。
解决这个问题的正确方法是什么?
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)
归档时间: |
|
查看次数: |
1249 次 |
最近记录: |