2016-05-30 15 views
2

考虑一个函数,有三个参数:使Python 3函数接受预设的正确方法是什么?

def foo(arg1, arg2, arg3): 
    pass 

,并提供一个元组预设类:

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

什么是正确的方式,使该函数接受或者3个单独的参数或一个元组的论点?

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

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

通常最好接受三个分离te论点。人们可以通过执行'foo(* Presets.preset2)'来轻松使用“预设”。 – BrenBarn

+0

这是一个难以调试的代码。正如一些答案所述,你应该只接受一个或另一个,并且呼叫者有责任遵守。调用'foo(* Presets.preset2)'就是一个很好的例子。 – Jivan

回答

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]) 

都是平等的调用。

3

的最简单的方法是只使用一个星号*使传递给foo当待平坦化的参数:

foo(*Presets.preset2) 

这相当于:

foo(*(3, 2, 1)) 

这相当于:

foo(3, 2, 1) 
相关问题