[英]Is it possible modify what the decorator function is decorating, if so, how? [closed]
我一直在玩装饰器,我想知道是否可以添加/附加/修改 python 装饰器正在装饰的内容。例如,我修改了以下示例: A Few Real World例子。
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()
是否可以 append 附加信息,以便我可以返回类似
uuid is: 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()
这很可能是不可能的,但我只是想问一下以防万一。
是的,这是可能的,尽管您可能想更好地阐明自己的意图,即从 function返回值而不是打印某些内容并返回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'
这个 function返回一个由装饰器附加的字符串。
诚然,这是一个人为的例子,但如果问题没有真正了解你正在尝试做的事情的实际意图,就很难展示更有用的东西。
如果您希望包装后的 function 可以使用 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
请注意,这要求修饰的 function 必须始终接受uuid
kwarg,否则当wrapper_uuid
尝试使用该参数调用func
时,您将收到运行时错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.