如何以非侵入方式为函数新增返回值且无需修改全部调用代码?
非侵入式新增函数返回值的实现方案
所有方案均兼容原有调用逻辑,无需修改任何历史调用代码:
- 方案1:新增可选开关参数,默认返回原有格式
该方案逻辑最直观,无兼容风险,适配所有场景:
优点:无黑魔法,不修改原有返回值的类型结构,适配所有场景;缺点:新调用需要额外传入开关参数。def foo(return_extra: bool = False): # 原有逻辑不变 if return_extra: return 'bar', 'baz' return 'bar' # 原有调用完全不用修改,语义和返回值和之前完全一致 re = foo() # 新业务需要额外返回值时,主动传参即可 re, extra = foo(return_extra=True) - 方案2:返回兼容原有类型的增强对象
该方案无需新增参数,新旧调用均可无感知使用:
优点:无需新增参数,原有调用无任何感知;缺点:仅兼容# 继承原有返回值类型定义增强类,新增属性存储额外返回值 class EnhancedStr(str): def __new__(cls, value, extra): instance = super().__new__(cls, value) instance.extra = extra return instance def foo(): return EnhancedStr('bar', 'baz') # 原有调用完全兼容,所有原有类型的操作效果和之前完全一致 re = foo() print(re) # 输出 bar print(re == 'bar') # 输出 True # 新调用直接读取增强属性即可拿到额外返回值 extra = re.extraisinstance类型判断,若原有代码存在type(re) == 原始类型的强校验逻辑会失效,不适用不可继承的基础类型场景。 - 方案3:通过可变输出参数接收额外值
该方案完全不修改原有返回值的结构和类型,适合有严格类型校验的场景:
优点:完全不改变原有返回值的任何属性,兼容所有类型判断逻辑;缺点:新调用需要额外声明可变容器,写法相对繁琐。def foo(extra_container: list = None): if extra_container is not None: # 把额外返回值存入传入的可变容器 extra_container.append('baz') return 'bar' # 原有调用完全兼容 re = foo() # 新调用传入可变容器接收额外值 extra = [] re = foo(extra_container=extra) print(extra[0]) # 输出 baz
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

