2017-05-19 10 views
1

私は、iABという引数をとる関数fを持っています。 iはカウンタであり、ABはリストまたは定数です。この関数は、リストの場合、i番目の要素をABに追加するだけです。ここでは、私はあなたがconst_or_list()関数が2つ(すべてではない)の入力引数の上で呼び出されたことがわかります Python 3での関数多型へのデコレータアプローチ

def const_or_list(i, ls): 
    if isinstance(ls, list): 
     return ls[i] 
    else: 
     return ls 

def f(i, A, B): 
    _A = const_or_list(i, A) 
    _B = const_or_list(i, B) 
    return _A + _B 

M = [1, 2, 3] 
N = 11 
P = [5, 6, 7] 
print(f(1, M, N)) # gives 13 
print(f(1, M, P)) # gives 8 

はPython 3に書かれているものです。私が上でやっていることを達成するためのデコレータ(おそらくもっとPythonic)アプローチがありますか?

あなたが行うことができます
+0

-arguments-be-a-function](http://stackoverflow.com/questions/919680/can-a-variable-number-of-arguments-be-passed-to-function) – Pavan

答えて

1

私は、この場合、より多くのニシキヘビがデコレータではないと思います。私は、isinstanceを取り除く代わりにするtry/exceptを使用し、中間変数を取り除くになります。

コード:

def const_or_list(i, ls): 
    try: 
     return ls[i] 
    except TypeError: 
     return ls 

def f(i, a, b): 
    return const_or_list(i, a) + const_or_list(i, b) 

テストコード:

M = [1, 2, 3] 
N = 11 
P = [5, 6, 7] 
Q = (5, 6, 7) 
print(f(1, M, N)) # gives 13 
print(f(1, M, P)) # gives 8 
print(f(1, M, Q)) # gives 8 

結果:

13 
8 
8 

しかし、私は本当にデコレータが必要になります。これは、缶-可変数の[あなたを助けることができる

ファイン、それはたくさんより多くのコードです...

def make_const_or_list(param_num): 
    def decorator(function): 
     def wrapper(*args, **kwargs): 
      args = list(args) 
      args[param_num] = const_or_list(args[0], args[param_num]) 
      return function(*args, **kwargs) 
     return wrapper 
    return decorator 

@make_const_or_list(1) 
@make_const_or_list(2) 
def f(i, a, b): 
    return a + b 
+1

ありがとうあなたの返事のために。試行錯誤のアプローチに関する良い点実際、デコレーターのアプローチはコードに沿って長くなっているようです。しかし、最終的な機能をシンプルな1ライナーに単純化します。数式がはるかに複雑で常に変化する私の実際の使用例では、明快さが最も重要です。 – Spinor8

0

def const_or_list(i, ls): 
    if isinstance(ls, list): 
     return ls[i] 
    else: 
     return ls 

def f(*args): 
    i_ip = args[0] 
    result_list = [] 
    for i in range(1, len(args)): 
     result_list.append(const_or_list(i_ip, args[i])) 
    return sum(result_list) 

M = [1, 2, 3] 
N = 11 
P = [5, 6, 7] 
print(f(1, M, N)) # gives 13 
print(f(1, M, P)) # gives 8