2012-05-03 29 views
0

(私は本当に良くタイトルを思い付くことができません!)私は関数の集合持って

のparamsキーワードで関数を呼び出す:

def foo(bar, baz) 
def spam(blah, etc, woof) 

と含まNamespaceオブジェクトを関数名と関数固有のパラメータ、例えばargs=(fun=foo, baz=111, baz=222)。どのように関数を呼び出してそれにパラメータを渡すのですか?このように、より良い:

x = vars(args) 
fun = x['fun'] 
del x['fun'] 
fun(**x) 

(私は良い一行のソリューションを探しています)。

+0

'args =(fun = foo、baz = 111、baz = 222)とは何ですか?たぶんあなたはより多くの文脈を提供するかもしれません... – glglgl

+1

あなたのソリューションには何が問題なのですか?シンプルで読みやすいです。 – marbdq

+0

@glglgl:ポストへのドキュメントのリンクを追加しました – georg

答えて

2

aDictがの下に関数名を持つ辞書です私は解決策をご提供することはありません

aDict.pop("fun")(**aDict)

+0

ニースですが、当初はdictではなく名前空間を持っています。 – georg

+1

@ thg435:次に 'aDict = vars(args);を実行します。 aDict.pop( "fun")(** aDict) '。それは動作しますか? – Tadeck

0

私はあなたが求めているのかわからないのですが、これは、同様の結果あなたを与える必要があります。

def callback(fun, *args, **kwargs): 
    return fun(*args, **kwargs) 

をして、あなたがそのようにそれを呼び出すことができます。順番に呼び出します

callback(some_func, 'a', 'b', c=10, d=123) 

some_func('a', 'b', c=10, d=123) 
+0

私の質問はどうやって正確にわかりませんでしたか? – georg

+2

あなたは 'args'を付けずに投稿しました。' args'でもあなたの "_namespace_"オブジェクトが本当に何であるかを言うのは難しいです。 – Tadeck

+0

ああ、右に、投稿へのドキュメントリンクを追加しました。 – georg

0

が、ここでヒントです::キーと他の引数あなたは試みることができる

>>> import inspect 
>>> def g(a, b, c=3): 
pass 

>>> inspect.getargs(g.func_code) 
Arguments(args=['a', 'b', 'c'], varargs=None, keywords=None) 

あなたは、引数とその順序を知っているだから今、あなたNamespaceオブジェクトを効果的に使用できます。 注:これはC-Pythonでのみ可能です!

>>> arguments = (1, 2, 3) 
>>> keywords = {} 
>>> g(*arguments, **keywords) 

素敵な一日を:この機能の使用を呼び出すための

+0

「私はあなたに解決策を提供しません」 - なぜですか? – georg

+0

引数クラスがあり、引数付きの関数を柔軟に呼び出す方法があります。これは、独自のソリューションを作成するのに十分です。 – User

1

x['fun'](**x)をお探しですか?

あなたの関数が**kwargs引数を取る限り動作します。そうでない場合は、名前空間から必要な項目をスライスする必要があります。

関連する問題