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

时间:2009-04-01 18:31:11

标签: python

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

有更好的方法来执行以下操作吗?

def method1(name)
    return 'Hello ' + name

def method2(methodToCall, methodToCallParams, question):
    greetings = methodToCall(methodToCallParams)
    return greetings + ', ' + question

method2(method1, 'Sam', 'How are you?')

5 个答案:

答案 0 :(得分:11)

如果您想在一次点击中打包调用,可以使用functools模块:

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进行更精确的操作,例如仅绑定一些参数,让您使用带有新签名的函数。在许多情况下使用它都太过分了,但它肯定有它的位置。

答案 1 :(得分:3)

你可以这样做:

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?')

答案 2 :(得分:2)

您可以functools.partial

使用jkp pointed out来执行此操作

然而,functools是Python 2.5中的新功能,所以为了处理这个问题,我使用了以下代码(实际上,这段代码在functools.partial的Python文档中)。

# 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

答案 3 :(得分:1)

另一个选择,如果您正在使用2.5版本的Python版本,那就是使用lambda作为闭包:

def some_func(bar):
    print bar

def call_other(other):
    other()

call_other(lambda param="foo": some_func(param))

HTH

答案 4 :(得分:0)

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

不是重新编写方向盘,而是指向示例的链接:http://code.activestate.com/recipes/52549/

但是,如果您在问题中模拟的情况确实如此简单,您可以将args列表作为位置参数或kwargs列表作为命名参数传递给另一个函数。

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)