【问题标题】:How to pass predefined arguments when storing a function存储函数时如何传递预定义的参数
【发布时间】:2014-11-10 21:09:49
【问题描述】:

是否可以存储具有预定义参数的函数以供另一个函数调用?

例如:

def function(num):
    print num

trigger=function #store function(1)
trigger()        #prints 1

trigger=function #store function(2)
trigger()        #prints 2

trigger 调用存储的任何内容而不传递任何参数。我可以更改触发器,但这需要我重写调用触发器的函数,所以我想知道在将函数存储在变量中时是否有办法将函数与参数一起存储。

【问题讨论】:

    标签: python arguments


    【解决方案1】:

    你正在寻找functools.partial:

    >>> import functools
    >>> def foo(number):
    ...     print number
    ... 
    >>> bar = functools.partial(foo, 1)
    >>> bar()
    1
    

    【讨论】:

    • 您似乎试图链接函数名称,但无法正确设置并放弃?关键是方括号在反引号之外。 (当然,如果您不喜欢我的编辑,请随时撤消它。)
    【解决方案2】:

    有人已经提到functools.partial 是首选,但您也可以使用不带参数的 lambda 函数:

    trigger1 = lambda: function(1)
    trigger2 = lambda: function(2)
    

    注意:正如有人提到的,在循环中定义这样的函数或通过引用 lambda 主体中可能更改的任何值时要小心。

    你可能会遇到这样的情况:

    a = []
    for i in range(5):
        a.append(lambda: i)
    
    b = [func() for func in a]
    # equals [4, 4, 4, 4, 4]
    
    # to avoid this, do a.append(lambda i=i: i)
    

    【讨论】:

    • 这里需要注意的一点是,这会创建一个闭包,所以如果你写 i=1 然后是 trigger1 = lambda: function(i) 而不是 lambda: function(1),然后 i 发生变化,它会打印i 的新值,而不是 1。当然,有时这正是您想要的——但如果不是,您会遇到关于 SO 的重复最多的问题之一(以及常见问题解答中的一个条目)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2019-09-06
    • 2013-01-07
    相关资源
    最近更新 更多