根据先前定义的指定参数的函数定义python函数

时间:2018-12-06 16:07:11

标签: python

我有一个已定义的函数,我想定义另一个与第一个完全相同的函数,但是指定一个参数。

一种可行的方法是

def my_function(arg1, arg2):
    print(arg1, arg2)

def my_function_foo(arg1):
    return(my_function(arg1, 'bar'))


>>> my_function_foo('foo')
foo bar

但是我想有一种更清洁的方法,更接近:

my_function_foo = my_function(arg2 = 'foo')

4 个答案:

答案 0 :(得分:2)

使用functools.partial

>>> from functools import partial
>>> my_function_foo = partial(my_function, arg2='bar')
>>> my_function_foo('foo')
foo bar

请注意,my_function_foo从技术上讲不是function,而是partial的实例。调用该实例将使用以预期方式合并的先前给定和当前参数来调用基础函数。

答案 1 :(得分:1)

您可以创建一个装饰器,该装饰器将为您传递参数。

from functools import wraps

def give_param(param='bar'):
    def inner_function(func):
        @wraps(func)
        def wrapper(*args, **kwargs):

            return func(*args, arg2=param)

        return wrapper

    return inner_function

@give_param('bar')
def my_function(arg1,arg2):
    # do some stuff
    print(arg1,arg2)

因此,如果您希望arg2 = 3,

@give_param(3)
def my_function(arg1,arg2):
    # do some stuff
    print(arg1,arg2)

答案 2 :(得分:0)

您可以使用以下内部函数解决问题:

def my_function(arg1, arg2='bar'):
    def my_function_foo(arg1):
        print(arg1, arg2)
    return my_function_foo(arg1)

my_function(arg1 = 'foo')

答案 3 :(得分:0)

您可以使用多重调度库来像C中那样进行方法覆盖:

from multipledispatch import dispatch

@dispatch(object, object)
def my_function(arg1, arg2):
    print(arg1, arg2)

@dispatch(object)
def my_function(arg1):
    return(my_function(arg1, 'bar'))

my_function('foo')
my_function('foo', 'foo')