6

関数に渡される実際のパラメーターの数を取得する方法はありますか

def foo(a, optional=42):
    if ????
        print "1 arg"
    else:
        print "2 args"

foo(11)      # should print 1 arg
foo(22, 42)  # should print 2 args

署名を変更せずに受け入れ*argsますか?

4

3 に答える 3

6

これを行うには、デコレータを使用できます。装飾された関数の署名を保持するという質問から、これを正しく行う方法がわかりました。

import decorator


@decorator.decorator
def count_args(f):
    def new(*args, **kwargs):
        kwargs['nargs'] = len(args)+len(kwargs)
        return f(*args, **kwargs)
    return new

@count_args
def foo(a, optional=42, nargs=1):
    print nargs

foo(1) # 1
foo(1, 4) # 2
foo(1, optional=4) # 2

アップデート:

関数に渡した引数の数のキーワード引数を追加しました。ご覧のとおり、デフォルトでは 1 で、これは True です。これはハックのように見えますが、機能します。

于 2013-10-25T12:41:01.457 に答える