2017-04-06 2 views
1

私は、個々の関数の名前とその引数を含むタプルのリストを取得し、インスタンス化しようとしています。これは、マルチスレッドアプリケーションに使用されます。私はこの高度なタプル操作を呼び出しますか?

import pandas as pd 

df = pd.DataFrame() 

def func1(df,arg2,arg3): 
    print 'func1' 
    print type(df) 
    print arg2,arg4 

def func2(arg1,df,arg3,arg4): 
    print 'func2' 
    print arg1 
    print type(df) 
    print arg3,arg4 

list_of_func_tups = [(func1,df,'two','three'),(func2,'one',df,'three','four')] 

for tup in list_of_func_tups: 
    f = tup[0] 
    args = tup[1:] 

    results = f(args) 

しかし、問題はargsはまだタプルとして見られているということである、したがって、唯一の引数が与えられたことを示すエラー。

TypeError: func1() takes exactly 3 arguments (1 given) 

どういうわけか、私は何とか引数を個別の引数と見なすことができますか?多分ループのようなものか何か? Anythin?

+6

のための二重のアスタリスクを使用することができます

f(*(1, 2, 3)) 

。 –

+0

SOO Freaking simple !!!ありがとうございました! – Daniel

答えて

1

あなたが探しているのはタプルをという位置引数として入力する方法です。

構文*expressionは、関数呼び出しで表示された場合は、 expression評価する必要があります。これはdocumentation of function callsに記載されて

result = f(*args) 

:あなたは大手アスタリスク(*を使用してこれを行うことができますiterableに変更します。この反復可能要素は、あたかもあたかものように扱われます。 引数;そこに位置引数X1、...、XNがあり、かつ 式は、シーケンスにY1を評価された場合...、YM、これはM + N位置引数とコール と同等ですx1、...、xN、y1、...、yMである。

3

はの関数を定義してみましょう:ウィレムは言及

def f(arg1, arg2, arg3): 
    return arg1 + arg2 + arg3 

として、あなたはアスタリスクでタプルやリストを平らにすることができます。 ``これはf(* argsを):あなたは、アスタリスクを使用する必要があります辞書

f(**{'arg1': 1, 'arg2': 2, 'arg3': 3}) 
関連する問題