考虑一个带三个参数的函数:
def foo(arg1, arg2, arg3):
pass
和一个在元组中提供预设的类:
class Presets():
preset1 = (1, 2, 3)
preset2 = (3, 2, 1)
使函数接受三个单独的参数或一个参数元组的正确方法是什么?
两者都应该是有效的函数调用:
foo(1,1,1)
foo(Presets.preset2)
答案 0 :(得分:4)
一种方法是使用装饰器。
from functools import wraps
def tupled_arguments(f):
@wraps(f) # keeps name, docstring etc. of f
def accepts_tuple(tup, *args):
if not args: # only one argument given
return f(*tup)
return f(tup, *args)
return accepts_tuple
@tupled_arguments
def foo(arg1, arg2, arg3):
pass
现在可以通过单独传递所有参数或者按顺序传递函数来调用函数。
foo(1,2,3)
foo((1,2,3))
foo([1,2,3])
都是平等的电话。
答案 1 :(得分:3)
最简单的方法是使用星号*
使参数在传递给foo
时变平:
foo(*Presets.preset2)
这相当于:
foo(*(3, 2, 1))
相当于:
foo(3, 2, 1)