1

間違った数の引数を指定して関数を呼び出したり、定義にないキーワード引数を指定して関数を呼び出したりすると、TypeError が返されます。コールバックがサポートするものに基づいて、コールバックを取得し、可変引数で呼び出すコードが必要です。それを行う1つの方法は、 callbackに対してandcbを使用することですが、それを のようなものに抽象化したいと思いますが、それは「適合する」引数のみを適用します。cb.__code__.cb_argcountcb.__code__.co_varnamesapply

例えば:

 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 にこのようなものはありますか、それともゼロから作成する必要がありますか?

4

2 に答える 2

7

自分で詳細を掘り下げるのではなく、関数のシグネチャを調べることができます。おそらくinspect.getargspec(cb).

関数を「適切に」呼び出すために、その情報と引数をどのように使用するかは、私には完全にはわかりません。簡単にするために、単純な名前付き引数のみを気にし、渡したい値が辞書にあると仮定しますd...

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

たぶん、あなたはもっと手の込んだものが欲しいと思っていて、正確に何を詳しく説明できますか?

于 2009-06-01T03:47:31.073 に答える
3

これかな?

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)
于 2009-06-01T03:57:23.490 に答える