问题描述
我一直在玩装饰器,我想知道是否可以添加/附加/修改 python 装饰器正在装饰的内容。例如,我修改了以下示例:{ {3}}。
import functools
def add_uuid(func):
@functools.wraps(func)
def wrapper_uuid(*args,**kwargs):
result = func(*args,**kwargs)
return result
return wrapper_uuid
@add_uuid
def print_uuid():
print("uuid is:")
print_uuid()
是否可以附加其他信息,以便我可以返回类似
的信息
uuid is: s921j239fjjj
?
这样的事情有可能吗?
import functools
def add_uuid(func):
@functools.wraps(func)
def wrapper_uuid(*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()
-ing 一些东西,如果这是你想要的。
import functools,uuid
def add_uuid(func):
@functools.wraps(func)
def wrapper_uuid(*args,**kwargs):
result = func(*args,**kwargs)
result += f" {uuid.uuid4()}"
return result
return wrapper_uuid
你可以这样使用:
>>> @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_uuid
尝试使用该参数调用 func
时,您将收到运行时错误。>