gpt4 book ai didi

Python 带参数的装饰器函数

转载 作者:行者123 更新时间:2023-12-01 01:04:32 24 4
gpt4 key购买 nike

我有这个例子:

def decorator_function_with_arguments(arg1, arg2, arg3):
def wrap(f):
print("Inside wrap")
def wrapped_f(*args):
print("Pre")
print("Decorator arguments:", arg1, arg2, arg3)
f(*args)
print("Post")
return wrapped_f
return wrap

@decorator_function_with_arguments("hello", "world", 42)
def sayHello(a1, a2, a3, a4):
print('sayHello arguments:', a1, a2, a3, a4)

sayHello("say", "hello", "argument", "list")

输出为:

内包装

装饰器参数:hello world 42
sayHello 参数:say hello 参数列表
发布

我对此的解释如下:decorator_function_with_arguments 获取其 3 个参数。它输出一个函数(wrap),接收一个函数并输出一个函数,这就是装饰的目的。所以现在 wrap 将被执行(“Inside wrap”被打印),装饰发生, wrap 接受 sayHello 并将其放入 wrapped_f,我们返回。现在,如果我调用 sayHello ,它将是它的包装版本,因此其余部分将被打印出来。好的,但现在如果我写这个:

def argumented_decor(dec_arg1):
def actual_decor(old_func):
print("Pre Wrapped")
def wrapped():
print("Pre Main")
print(dec_arg1)
old_func()
print("Post Main")
return actual_decor
return actual_decor

@argumented_decor("Decor Argument")
def f2():
print("Main")

f2()

当调用f2时,我收到错误消息:类型错误:actual_decor() 缺少 1 个必需的位置参数:'old_func'

为什么? argumented_decor 获取其参数, actual_decor 将被执行,“Pre Wrapped”将被打印, f2 将被包装。现在,如果我调用它,它应该作为最内部的 wrapped 函数。为什么不?我希望我能以可以理解的方式提出我的问题。谢谢!

最佳答案

当您的 actual_decor 函数应该返回包装器函数 wrapped 时,它会返回自身:

def argumented_decor(dec_arg1):
def actual_decor(old_func):
print("Pre Wrapped")
def wrapped():
print("Pre Main")
print(dec_arg1)
old_func()
print("Post Main")
return wrapped
return actual_decor

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

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