2011-07-27 18 views
2

私は、引数の任意のセットをとり、引数の型に基づいてそれらを処理する正しい関数を選択する関数を持っています。Pythonのパラメータ型に基づいて関数を選択する

私の現在のアプローチは、引数の型をチェックし、引数を受け入れるまですべての関数を反復処理するすべての処理関数でデコレータを使用しています。

これについて何か私にはちょっとハックしたようですが、比較的新しいPythonプログラマとして、これを行うためにもっと「pythonic」メソッドがあるのだろうかと思っていました。

def accepts(*types) : 
    def my_decorator(func): 
     def wrapped(*args, **kwargs): 
     for i in range(len(types)): 
      if not isinstance(args[i], types[i]): 
       raise TypeError('Type error, %s not instance of %s, it is %s' %(args[i],types[i], type(args[i]))) 
      return func(*args, **kwargs) 
     return wrapped 
    return my_decorator 

EDIT:このようなデコレータを持っているでしょう '機能' で

def function_router(*args): 
    for func in functions: #functions is a list of functions 
     try: 
     return func(*args) 
     except TypeError: 
     pass 
    #probably raise an exception if no function works 

と各機能:

ので、現在、私はこのような何かを持っている男ああ、私は実際本当にすべてのソリューションを読んで好きだった。私が選んだ答えは、私が現在行っていることに対して最も効果的でしたが、すべての答えから何かを学んだので、あなたのすべての時間に感謝します。

+1

あなたはデコレータを使用している方法のいくつかの実例を与えてもらえますか? – NPE

答えて

4

おそらく、これを行う正しい方法は、引数の種類に頼るのではなく、キーワード引数を使用することです。そうすれば、小さな関数を飾る必要はなく、引数の名前を正しく指定するだけです。また、Pythonのダックタイピングを利用することもできます。

+0

明確化質問: それぞれの関数がkwargsを使用していると言っていますか?kwargsが悪い関数を呼び出すと、エラーがスローされますか? (本質的には、同じロジック、デコレータなしで済ませていますか?) –

+0

本質的に、はい。 '' kwargs'を使う。 – nmichaels

関連する問題