是否可以修改装饰器函数正在装饰的内容,如果可以,如何修改?

问题描述

我一直在玩装饰器,我想知道是否可以添加/附加/修改 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 时,您将收到运行时错误。>