TypeError例外を呼び出さずに、引数の数が間違っ持つPythonの関数を呼び出すための方法はありますか?

StackOverflow https://stackoverflow.com/questions/933484

  •  06-09-2019
  •  | 
  •  

質問

あなたが間違った数の引数を持つ関数を呼び出すと、

、またはその定義されていないキーワード引数で、あなたはTypeError例外を取得します。私は、コールバックを取ると、コールバックをサポートしているものに基づいて、可変引数でそれを呼び出すためのコードの一部をしたいと思います。これを行う方法の1つは、コールバックcbため、cb.__code__.cb_argcountcb.__code__.co_varnamesを使用することですが、私はapplyのようなものの中に、しかし、それは唯一の「フィット」の引数をかなり抽象的に適用することをます。

 def foo(x,y,z):
   pass

 cleanvoke(foo, 1)         # should call foo(1, None, None)
 cleanvoke(foo, y=2)       # should call foo(None, 2, None)
 cleanvoke(foo, 1,2,3,4,5) # should call foo(1, 2, 3)
                           # etc.

すでにPythonで、このようなものはありますか、それは私が一から書くべきものでしょうか?

役に立ちましたか?

解決

むしろ細部に自分自身を掘り下げるよりも、あなたは関数のシグネチャを調べることができます - あなたは、おそらくinspect.getargspec(cb)をしたい。

ちょうどあなたがその情報をどのように使用するか、あなたが持っている引数、「適切」機能を呼び出すために、私には完全に明確ではありません。あなただけの単純な名前の引数を気に簡単にするために仮定すると、あなたが合格したい値は辞書のdである...

args = inspect.getargspec(cb)[0]
cb( **dict((a,d.get(a)) for a in args) )

たぶん、あなたは手の込んだ何かをしたい、と正確に何を上手の込んだことができますか?

他のヒント

この多分?

def fnVariableArgLength(*args, **kwargs):
    """
    - args is a list of non keywords arguments
    - kwargs is a dict of keywords arguments (keyword, arg) pairs
    """
    print args, kwargs


fnVariableArgLength() # () {}
fnVariableArgLength(1, 2, 3) # (1, 2, 3) {}
fnVariableArgLength(foo='bar') # () {'foo': 'bar'}
fnVariableArgLength(1, 2, 3, foo='bar') # (1, 2, 3) {'foo': 'bar'}
<時間>

編集あなたのユースケース

def foo(*args,*kw):
    x= kw.get('x',None if len(args) < 1 else args[0])
    y= kw.get('y',None if len(args) < 2 else args[1])
    z= kw.get('z',None if len(args) < 3 else args[2])
    # the rest of foo

foo(1)         # should call foo(1, None, None)
foo(y=2)       # should call foo(None, 2, None)
foo(1,2,3,4,5) # should call foo(1, 2, 3)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top