向包装函数添加第二个返回值,而不丢失向后兼容性

2024-03-28 15:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在第三方框架中,源响应函数包装如下:

from flask import Response

def wrap_func(func):
    def add_context(*args, **kwargs):
        output_value = func(*args, **kwargs)

        return Response(
            output_value
        )

    return add_context

开发人员可以使用这个decorator来创建一个自定义函数,比如一个入口点:

@wrap_function
def hello():
    return '<b>Hello</b>'

框架创建响应并发送,此功能隐藏在“引擎盖下”。你知道吗

现在我需要设置一些Response参数,比如来自函数hello的cookies。由于没有包装器的更改似乎是不可能的,所以我决定对框架做出贡献。你知道吗

我的第一个想法是用响应参数从包装函数(hello)返回一个可选值,然后在add_context内解析它。注意,向后兼容性很重要,“旧样式”函数应该和“新”函数一样工作,并带有响应参数。因此,除了hello,包装器还必须支持以下函数:

@wrap_function
def ping():
    return '<b>Hello</b>', {'cookies': [('te', 'st')]}

但对我来说,这绝对是一个黑客的工作。也许有一些最佳实践来实现这样的更改,或者更好的方法来修改包装函数的返回而不丢失兼容性?你知道吗


Tags: 函数框架addhellooutput参数returnvalue
1条回答
网友
1楼 · 发布于 2024-03-28 15:16:38

最后我决定用简单灵活的方式。现在,wrapped函数应该像往常一样返回markdown或Response对象,并用markdown body初始化。然后,在包装器内部,根据isinstance执行不同的操作。你知道吗

from flask import Response

def wrap_func(func):
    def add_context(*args, **kwargs):
        output_value = func(*args, **kwargs)

        if isinstance(output_value, Response):
            return output_value
        else:
            return Response(
                output_value
            )

    return add_context

尽管在这个最小的示例之外,包装器需要修改响应主体,但它在基于Response创建CustomResponse并重新定义所需的操作之后才能工作。你知道吗

相关问题 更多 >