繁体   English   中英

是否可以修改装饰器 function 正在装饰的内容,如果可以,如何修改? [关闭]

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM