Python 是否可以修改decorator函数所修饰的内容,如果可以,如何修改?

Python 是否可以修改decorator函数所修饰的内容,如果可以,如何修改?,python,decorator,Python,Decorator,我已经玩了一段时间装饰程序,我想知道是否有可能添加/附加/修改python装饰程序正在装饰的内容。。例如,我修改了以下示例: 是否可以附加其他信息,以便我可以返回类似的内容 uuid是:s921j239fjjj 这样的事情可能吗 import functools def add_uuid(func): @functools.wraps(func) def wrapper_uuid(*args, **kwargs): result = func(*args, **

我已经玩了一段时间装饰程序,我想知道是否有可能添加/附加/修改python装饰程序正在装饰的内容。。例如,我修改了以下示例:

是否可以附加其他信息,以便我可以返回类似
的内容
uuid是:s921j239fjjj

这样的事情可能吗

import functools

def add_uuid(func):
    @functools.wraps(func)
    def wrapper_uuid(*args, **kwargs):
        result = func(*args, **kwargs)
        #generate uuid
        #result += uuid
        return result
    return wrapper_uuid


@add_uuid
def print_uuid():
    print("uuid is:") #would print "uuid is:s921j239fjjj"

print_uuid()

这很可能是不可能的,但我只是想问一下以防万一。

是的,这是可能的,尽管您可能希望更好地阐明自己的意图,即从函数返回值,而不是打印某些内容并返回
None

您可以修改示例中的“
result+=uuid
”占位符以实际执行某些操作。可能是:

  • 修改中间返回值
  • print()
    -如果你想要的话,可以打印一些东西
导入工具,uuid def add_uuid(功能): @functools.wrapps(func) def wrapper_uuid(*args,**kwargs): 结果=函数(*args,**kwargs) 结果+=f“{uuid.uuid4()}” 返回结果 返回包装器 您可以这样使用:

>>> @add_uuid
... def show_uuid():
...     return "uuid is"
... 
>>> show_uuid()
'uuid is 4b942554-78b5-45f4-8a93-dc9279327c89'
此函数返回一个由装饰器追加的字符串


诚然,这是一个人为的例子,但如果没有真正了解您试图做什么的实际意图,就很难展示更有用的东西。

如果您希望uuid可用于包装函数(以便您可以使用它进行打印等操作),则需要将其作为参数传递。例如:

import functools
import uuid


def add_uuid(func):
    @functools.wraps(func)
    def wrapper_uuid(*args, **kwargs):
        result = func(uuid=uuid.uuid4(), *args, **kwargs)
        return result
    return wrapper_uuid


@add_uuid
def print_uuid(uuid):
    print("uuid is: ", uuid)


print_uuid()
uuid is:  925864bb-3984-4945-adc1-c123522531a8
打印(例如):


请注意,这要求修饰后的函数必须始终接受
uuid
kwarg,否则当
wrapper\u uuid
尝试使用该参数调用
func
时,您会遇到运行时错误。

您的修饰器不会执行任何操作。你会问,“像这样的事情可能吗?”这就是问题的关键所在,但是你正在修饰的函数没有返回任何东西,所以
+=
对你没有帮助。第一个例子中的装饰器什么都不做,问题的答案是“是”,这就是装饰器的关键所在。
uuid is:  925864bb-3984-4945-adc1-c123522531a8