代码之家  ›  专栏  ›  技术社区  ›  Dan

在python中,将一个方法(带参数)传递给另一个方法的最佳方式是什么

  •  2
  • Dan  · 技术社区  · 17 年前

    将方法和方法参数传递给另一个方法的最佳方式是什么?

    def method1(name)
        return 'Hello ' + name
    
    def method2(methodToCall, methodToCallParams, question):
        greetings = methodToCall(methodToCallParams)
        return greetings + ', ' + question
    
    method2(method1, 'Sam', 'How are you?')
    
    5 回复  |  直到 17 年前
        1
  •  11
  •   jkp    17 年前

    from functools import partial
    
    def some_function(param_one, param_two):
        print "Param One: %s" % param_one
        print "Param Two: %s" % param_two
    
    def calling_function(target):
        target()
    
    calling_function(partial(some_function, "foo", "bar"))
    

    你也可以用functools.partial做一些更精细的事情,比如只绑定一些参数,留下一个带有新签名的函数。在很多情况下使用它是过分的,但它确实有它的位置。

        2
  •  3
  •   Caotic    17 年前

    def method1(name):
        def wrapper():
            return 'Hello ' + name
        return wrapper
    
    def method2(method, question):
        output = method()
        return output + ', ' + question
    
    method2(method1(name = 'Sam'), 'How are you?')
    

    当然,您也可以在method()调用中传递一些变量:

    def method1(name):
        def wrapper(greeting):
            return greeting + name
        return wrapper
    
    def method2(method, question):
        output = method(greeting = 'Hello ')
        return output + ', ' + question
    
    method2(method1(name = 'Sam'), 'How are you?')
    
        3
  •  2
  •   Community Mohan Dere    9 年前

    你可以用 functools.partial 这样做,就像 jkp pointed out

    # functools is Python 2.5 only, so we create a different partialfn if we are
    # running a version without functools available
    try:
        import functools
        partialfn = functools.partial
    except ImportError:
        def partialfn(func, *args, **keywords):
            def newfunc(*fargs, **fkeywords):
                newkeywords = keywords.copy()
                newkeywords.update(fkeywords)
                return func(*(args + fargs), **newkeywords)
            newfunc.func = func
            newfunc.args = args
            newfunc.keywords = keywords
            return newfunc
    
        4
  •  1
  •   jkp    17 年前

    如果您使用的是Python 2.5之前的版本,另一个选项是使用lambda作为闭包:

    def some_func(bar):
        print bar
    
    def call_other(other):
        other()
    
    call_other(lambda param="foo": some_func(param))
    

        5
  •  0
  •   Jarret Hardie    17 年前

    您正在考虑使用curry,将函数和参数绑定在一起,以便稍后调用。通常使用curry,以便您可以在实际调用函数时添加其他参数。

    与其重新编写控制盘,不如链接到一个示例: http://code.activestate.com/recipes/52549/ .

    def method1(name):
        return 'Hello %s' % name
    
    args = ['Joe']
    method1(*args)
    
    def method1a(name=None, salutation=None):
        return 'Hello %s %s' % (name, salutation)
    
    kwargs = {'name':'Joe', 'salutation':'Mr'}
    method1a(**kwargs)