【问题标题】:How to use a lambda as a default argument?如何使用 lambda 作为默认参数?
【发布时间】:2019-10-30 02:04:41
【问题描述】:

我正在尝试创建一个带有可选参数的函数,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”结尾处遇到语法错误。

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

【问题讨论】:

  • 只需使用cb = kwargs.get('callback', lambda _: None)。这是必要的,因为pass 是一个语句,而不是lambda 需要的表达式。您也可以使用def do_the_thing(callback=lambda _: None):,而无需使用kwargs.get()(只需使用callback("Things have been done."))。

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


【解决方案1】:

Pythons 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)*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多