3

それで、私はしばらくの間これに固執していて、私がいくつかのアドバイスを求めるだろうと考えています。関数docstringを変更し、オプションの引数を許可するか、または何も許可せず、署名を保持できるデコレータを作成しようとしています。これとは別に、これらを行うことができます。そして、3つのうち2つを取得することさえできます。

以下のサンプルは、docstringを変更し、オプションの引数を許可するか、または何も許可しないようです。ただし、このメソッドは署名を保持しません。

from functools import wraps
def thisDecorator(*targs, **tkwargs):
    def internalFunc(func):
        func.__doc__ = "Added this... {0}".format(func.__doc__)
        @wraps(func)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper
    if len(targs) == 1 and callable(targs[0]):
        return internalFunc(targs[0])
    else:
        return internalFunc

署名を保持するデコレータモジュールについて読みましたが、docstringを変更できないようです。

すべての助けは大歓迎です

4

2 に答える 2

4

内部ラッパーにデコレータを追加すると、関数のシグネチャが保持されます。

from functools import wraps
from decorator import decorator

def thisDecorator(*targs, **tkwargs):
    def internalFunc(func):
        func.__doc__ = "Added this... {0}".format(func.__doc__)
        @wraps(func)
        def wrapper(func, *args, **kwargs):
            return func(*args, **kwargs)
        return decorator(wrapper, func)
    if len(targs) == 1 and callable(targs[0]):
        return internalFunc(targs[0])
    else:
        return internalFunc
于 2012-11-09T21:53:04.757 に答える
0

あなたの要件を完全には理解していないかもしれませんが、これは私にとってはうまくいっているようです:

class myDeco:
    def __init__(self, f):
        self.f = f
        if f.__doc__:
            self.__doc__ = 'great doc: ' + f.__doc__
        else:
            self.__doc__ = 'ooohh, no doc'
    def __call__(self, *args, **kwargs):
        print "decorator args and kwargs: {0}, {1}".format(args, kwargs)
        self.f(*args, **kwargs)

@myDeco
def test1():
    """test1 doc"""
    print 'test1'

@myDeco
def test2(a, b):
    print 'test2: {0}, {1}'.format(a,b)

@myDeco
def test3(a, *args):
    print "test3: {0}, {1}".format(a, args)

@myDeco
def test4(a, *args, **kwargs):
    print "test4: {0}, {1}, {2}".format(a, args, kwargs)


print test1.__doc__
print test2.__doc__
print test3.__doc__
print test4.__doc__

test1()
test2(1,2)
test3(1,2,3)
test4(1,2,3, foo=4, bar=5)

署名は保持され、ドキュメントは変更され、オプションの引数が許可されます。出力は次のとおりです。

great doc: test1 doc
ooohh, no doc
ooohh, no doc
ooohh, no doc
decorator args and kwargs: (), {}
test1
decorator args and kwargs: (1, 2), {}
test2: 1, 2
decorator args and kwargs: (1, 2, 3), {}
test3: 1, (2, 3)
decorator args and kwargs: (1, 2, 3), {'foo': 4, 'bar': 5}
test4: 1, (2, 3), {'foo': 4, 'bar': 5}
于 2012-11-09T19:41:32.733 に答える