2016-05-30 41 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) 
相關問題