我有一个已定义的函数,我想定义另一个与第一个完全相同的函数,但是指定一个参数。
一种可行的方法是
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')
答案 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')