使Python 3函数接受预设的正确方法是什么?

时间:2016-05-30 05:09:00

标签: python python-3.x

考虑一个带三个参数的函数:

def foo(arg1, arg2, arg3):
    pass

和一个在元组中提供预设的类:

class Presets():
    preset1 = (1, 2, 3)
    preset2 = (3, 2, 1)

使函数接受三个单独的参数或一个参数元组的正确方法是什么?

两者都应该是有效的函数调用:

foo(1,1,1)
foo(Presets.preset2)

2 个答案:

答案 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)