2012-08-27 27 views
1

我使用Sphinx来记录我用Python编写的一些代码。我在项目中使用了Stuart Gathman的pymilter库,所以我的许多功能都被装饰了。我在这里看到了有关装饰函数和Sphinx的问题,但它们不适用于我,因为我无法修改milter库代码。我无法修改的狮身人面像和装饰器

关于如何解决这个问题而不必重写我的狮身人面像文档的想法会很好。

感谢

@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

您可以使用此:

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' 

你也可以定义自己的d ecorator将一个装饰器作为参数并正确地包装该函数。