gpt4 book ai didi

用于函数子段的 Python 装饰器

转载 作者:行者123 更新时间:2023-12-01 08:39:29 25 4
gpt4 key购买 nike

在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:现在看来我别无选择,只能期望框架用户以某种方式声明命名函数......

最佳答案

函数体被编译成作为一个整体运行的单个“代码”对象 - 更改此代码对象的运行方式,在其中插入内容,这些内容可能与语言代码本身一样复杂(即实际“执行”Python 字节码的代码)。

因此,通过使用已经执行此操作的语言中的语句,可以更轻松地完成执行流程中的任何更改。

如果您想要在函数体内的各个部分中使用通用装饰器,最简单的方法是将函数本身分割为内部函数 - 然后您可以应用转换,或者多次执行每个部分,通过简单地调用这些函数(甚至直接装饰它们)。

但是,如果您提出问题,您可以而且可能应该只使用普通的旧 for 循环:

def foo():
for _ in (0, 1):
print("hello")
print("stack")
for _ in (0, 1):
print("overflow")

对于任意“类似装饰器的行为”,正如我上面所写,只需使用嵌套函数:

def foo():
@deco_double
def part1()
print("hello")
print("stack")
part1()
@deco_double:
def part2():
print("overflow")
part2()

关于用于函数子段的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53573789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com