如何跳过或忽略Python装饰器

2024-10-01 04:54:38 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个函数被decorator包装,它以HTML的形式返回函数的输出。我想调用这个函数,而不使用装饰器的HTML包装。有可能吗?在

示例:

class a:
    @HTMLwrapper
    def returnStuff(input):
        return awesome_dict

    def callStuff():
        # here I want to call returnStuff without the @HTMLwrapper, 
        # i just want the awesome dict.

Tags: the函数示例inputdefhtml装饰decorator
3条回答
__author__ = 'Jakob'

class OptionalDecoratorDecorator(object):
    def __init__(self, decorator):
        self.deco = decorator

    def __call__(self, func):
        self.deco = self.deco(func)
        self.func = func
        def wrapped(*args, **kwargs):
            if kwargs.get("no_deco") is True:
                return self.func()
            else:
                return self.deco()
        return wrapped

def spammer(func):
    def wrapped():
        print "spam"
        return func()
    return wrapped

@OptionalDecoratorDecorator(spammer)
def test():
    print "foo"

test()
print "***"
test(no_deco=True)

当然可以:

class Example(object):
    def _implementation(self):
        return something_awesome()

    returnStuff = HTMLwrapper(_implementation)

    def callStuff(self):
        do_something_with(self._implementation())
class a:
    @HTMLwrapper
    def return_stuff_as_html(self, input):
        return self.return_stuff(input)
    def return_stuff(self, input):
        return awesome_dict

I did the same thing while waiting for a response and it works fine for me, but I'd still like to know if there's an even better way :) – olofom

因为在python中函数和方法都是对象,而且decorator返回一个可调用的,所以您可以在修饰的方法上设置一个指向原始方法的属性,但是像my_object那样的调用_instance.decorated_方法.original_method()会更难看,也不太明确。在

^{pr2}$

相关问题 更多 >