python - 在不失去向后兼容性的情况下向包装函数添加第二个返回值

标签 python flask refactoring

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

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

开发人员可以使用这个装饰器来创建一个类似于入口点的自定义函数:

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

框架创建响应并发送它,此功能隐藏在“幕后”。

现在我需要设置一些Response 参数,例如我的函数hello 中的cookie。由于不更改包装器似乎是不可能的,因此我决定为该框架做出贡献。

不过,我的第一个想法是使用响应参数从包装函数 (hello) 返回一个可选值,然后在 add_context 中解析它。请注意,向后兼容性很重要,“老式”函数应该和"new"函数一样工作,带有响应参数。因此,除了 hello 之外,wrapper 还必须支持这样的功能:

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

但对我而言,这绝对是一项黑客工作。也许有一些最佳实践可以实现此类更改,或者有更好的方法来修改包装函数的返回值而不失兼容性?

最佳答案

最后我决定让它变得简单灵活。现在包装函数应该像往常一样返回一个 markdown 或 Response 对象并用 markdown 主体初始化。然后,在包装器内部,根据 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 并重新定义所需的操作之后工作。

关于python - 在不失去向后兼容性的情况下向包装函数添加第二个返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026938/

相关文章:

python - Pandas - 填充特定类别的平均值

python - 使用huggingface fill-mask管道获得超过5条建议

python - 如何使用 Python 中的特定条件从另一个列表创建列表?

C#:您建议如何重构这些类? (接口(interface)、聚合或其他任何东西)

java - 重构带标签的循环

python - Django 的用户身份验证系统的默认 URL 是什么?

python - 带有 Flask 的 Windows 服务仅在 DEBUG 模式下运行。正常模式似乎崩溃

python - 在Jinja2模板中集成Ember-widgets Highchart

python - SQLalchemy/Flask - 一对一嵌套

.net - 具有许多条件返回语句的重构方法