为了账号安全,请及时绑定邮箱和手机立即绑定

函数子段的 Python 装饰器

函数子段的 Python 装饰器

LEATH 2021-09-02 20:32:54
在 Python 中,有没有一种很好的方法可以将装饰器(或类似的东西)应用到函数体的一个子段而不是整个函数?我想要的可能看起来像这样:def deco_double(f):    def wrapper():            f()            f()    return wrapperdef foo():    @deco_double:        print("hello")        print("stack")    @deco_double:        print("overflow")foo()所以执行结果如下:hellostackhellostackoverflowoverflow如果解决方案不完全是装饰器也没关系,我需要的是一种包装函数子段的方法,但要以一种很好的抽象方式。先感谢您 :)编辑: 只是分成多个功能对我来说不是一个选择。我正在为程序员开发一个框架,我希望他们以紧凑的方式编写函数(用于在示例中编写 foo()。此外,我实际上在做的事情远比重复复杂得多)编辑2: 现在看来我别无选择,只能期望框架用户以某种方式声明命名函数......
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

您必须提取部分功能foo()以分离函数,然后将装饰器作为函数应用并显式调用它。


def deco_double(f):

    def wrapper():

            f()

            f()

    return wrapper


def my_f1():

     print("hello")

     print("stack")


def my_f2():

     print("overflow")


def foo():

    deco_double(my_f1)()

    deco_double(my_f2)()


foo()


查看完整回答
反对 回复 2021-09-02
?
达令说

TA贡献1821条经验 获得超6个赞

只需使用装饰器声明两个具有任何名称的@deco_double函数,并在任何其他函数中调用它们,在您的情况下foo(),然后简单地调用foo().


def deco_double(f):

    def wrapper():

            f()

            f()

    return wrapper

@deco_double

def func1():

     print("hello")

     print("stack")

@deco_double

def func2():

     print("overflow")

def foo():

    func1()

    func2()

foo()

此代码的输出。


hello

stack

hello

stack

overflow

overflow


查看完整回答
反对 回复 2021-09-02
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信