1

私は 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
4

1 に答える 1

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

ただし、お気づきのとおり、これに関する問題は、デコレータがfunctools.wrapsを使用しなかったため、変数__doc__と変数が保持されないことです。__name__

>>> f.__doc__
'docstring'
>>> dec(f).__doc__
>>>

したがって、元のデコレータ定義を変更することはできないので、自分でラップするだけです。

>>> functools.wraps(f)(dec(f))()
hey
>>> functools.wraps(f)(dec(f)).__doc__
'docstring'

デコレータを引数として取り、関数を適切にラップする独自のデコレータを定義することもできます。

于 2012-08-28T19:28:23.440 に答える