Python 是否可以修改decorator函数所修饰的内容,如果可以,如何修改?
我已经玩了一段时间装饰程序,我想知道是否有可能添加/附加/修改python装饰程序正在装饰的内容。。例如,我修改了以下示例: 是否可以附加其他信息,以便我可以返回类似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, **
的内容
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()
>>> @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