猿问

函数子段的 Python 装饰器

在 Python 中,有没有一种很好的方法可以将装饰器(或类似的东西)应用到函数体的一个子段而不是整个函数?


我想要的可能看起来像这样:


def deco_double(f):

    def wrapper():

            f()

            f()

    return wrapper


def foo():

    @deco_double:

        print("hello")

        print("stack")

    @deco_double:

        print("overflow")


foo()

所以执行结果如下:


hello

stack

hello

stack

overflow

overflow

如果解决方案不完全是装饰器也没关系,我需要的是一种包装函数子段的方法,但要以一种很好的抽象方式。先感谢您 :)


编辑: 只是分成多个功能对我来说不是一个选择。我正在为程序员开发一个框架,我希望他们以紧凑的方式编写函数(用于在示例中编写 foo()。此外,我实际上在做的事情远比重复复杂得多)


编辑2: 现在看来我别无选择,只能期望框架用户以某种方式声明命名函数......


LEATH
浏览 172回答 3
3回答

宝慕林4294392

您必须提取部分功能foo()以分离函数,然后将装饰器作为函数应用并显式调用它。def deco_double(f):    def wrapper():            f()            f()    return wrapperdef my_f1():     print("hello")     print("stack")def my_f2():     print("overflow")def foo():    deco_double(my_f1)()    deco_double(my_f2)()foo()

达令说

只需使用装饰器声明两个具有任何名称的@deco_double函数,并在任何其他函数中调用它们,在您的情况下foo(),然后简单地调用foo().def deco_double(f):    def wrapper():            f()            f()    return wrapper@deco_doubledef func1():     print("hello")     print("stack")@deco_doubledef func2():     print("overflow")def foo():    func1()    func2()foo()此代码的输出。hellostackhellostackoverflowoverflow
随时随地看视频慕课网APP

相关分类

Python
我要回答