我正在使用Sphinx来记录我用Python编写的一些代码。我在我的项目中使用了Stuart Gathman的pymilter库,因此我的许多功能都被装饰了。我已经在SO上看到了有关装饰函数和Sphinx的问题,但它们并不适用于我,因为我无法修改milter库代码。
如何在不重写我的Sphinx文档的情况下解决这个问题的想法会很棒。
由于
@Milter.noreply
def header( self, name, hval ):
"""
Processes headers from the incoming message and writes them to a new variable for database storage.
"""
rgxSubject = re.compile( '^(subject)', re.IGNORECASE | re.DOTALL )
rgxMessageID = re.compile( '^(message-id)', re.IGNORECASE | re.DOTALL )
self.fp.write( "%s: %s\n" % ( name, hval ) )
self.headers.append( "%s: %s\n" % ( name, hval ) )
if ( rgxSubject.search( name ) ) or ( rgxMessageID.search( name ) ):
self.log.info( "%s: %s" % ( name, hval ) )
self.subjMsgId[name] = hval
if ( rgxSubject.search( name ) ): self.Subject = hval
return Milter.CONTINUE
答案 0 :(得分:0)
你可以用这个:
import functools
def header( self, name, hval ):
pass
# ...
header = functools.wraps(header)(Milter.noreply(header))
举一个这样做的例子,考虑这个装饰器和函数:
>>> def dec(f):
... def wrap():
... return f()
... return wrap
...
>>>
>>> def f():
... """docstring"""
... print 'hey'
装饰器只是一个返回函数的可调用函数,因此您可以使用函数作为参数调用装饰器,然后调用结果:
>>> dec(f)
<function wrap at 0x10909e758>
>>> dec(f)()
hey
但正如您所指出的,问题是__doc__
和__name__
变量未保留,因为装饰器未使用functools.wraps:
>>> f.__doc__
'docstring'
>>> dec(f).__doc__
>>>
因此,由于您无法修改原始装饰器定义,因此请自行封装:
>>> functools.wraps(f)(dec(f))()
hey
>>> functools.wraps(f)(dec(f)).__doc__
'docstring'
您还可以定义自己的装饰器,将装饰器作为参数并正确包装函数。