4

したがって、次のように...

    def makeBold(fn):
        def wrapped():
            return '<b>'+fn()+'</b>'
        return wrapped

    @makeBold
    def produceElement():
        return 'hello'

結果は

    <b>hello</b>

私はこのようなことをしたいと思います...

    @makeBold(attrib=val, attrib=val)
    def produceElement():
        return 'hello'

結果は次のようになります...

    <b attrib=val, attrib=val>hello<b/>

どんなアドバイスも素晴らしいでしょう!

4

3 に答える 3

2

これがデコレータの適切な使用例であるかどうかはおそらく疑わしいですが、ここでは:

import string

SelfClosing = object()

def escapeAttr(attr):
    # WARNING: example only, security not guaranteed for any of these functions
    return attr.replace('"', '\\"')

def tag(name, content='', **attributes):
    # prepare attributes
    for attr,value in attributes.items():
        assert all(c.isalnum() for c in attr)  # probably want to check xml spec
    attrString = ' '.join('{}="{}"'.format(k,escapeAttr(v)) for k,v in attributes.items())

    if not content==SelfClosing:
        return '<{name} {attrs}>{content}</{name}>'.format(
            name = name,
            attrs = attrString,
            content = content
        )
    else:  # self-closing tag
        return '<{name} {attrs}/>'

例:

def makeBoldWrapper(**attributes):
    def wrapWithBold(origFunc):
        def composed(*args, **kw):
            result = origFunc(*args, **kw)
            postprocessed = tag('b', content=result, **attributes)
            return postprocessed
        return composed
    return wrapWithBold

デモ:

@makeBoldWrapper(attr1='1', attr2='2')
def helloWorld(text):
    return text

>>> print( helloWorld('Hello, world!') )
<b attr2="2" attr1="1">Hello, world!</b>

デコレーターに関する一般的な誤解は、パラメーター(attr1=...)がデコレーターに対するパラメーターであるというもの@myDecoratorです。そうではありません。むしろ、関数呼び出しの結果はmyDecoratorFactory(attr1=...)として計算されsomeresult、匿名のデコレーターになり@someresultます。したがって、「引数付きデコレータ」は実際には、デコレータを値として返す必要があるデコレータ ファクトリです。

于 2013-07-19T21:18:53.240 に答える