3

所以我已经坚持了一段时间,我想我会寻求一些建议。我正在尝试创建一个装饰器,它可以修改函数文档字符串,允许可选参数或无参数,并且保留签名。这些可以单独进行。甚至得到三个中的两个。

下面的示例似乎修改了文档字符串并允许可选参数或没有参数。但是,此方法不保留签名。

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

我已经阅读了确实保留签名的装饰器模块,但我似乎无法修改文档字符串。

非常感谢所有帮助

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 回答