【问题标题】:How to deprecate a function input argument and maintain backward compatibility如何弃用函数输入参数并保持向后兼容性
【发布时间】:2021-12-09 14:23:25
【问题描述】:

我想更改函数的输入参数。这也会导致函数体内的变化。 什么是标记输入参数“已弃用”并同时保持向后兼容性的pythonic方法?这是一个玩具示例:

from typing import List


# original function
def sum_numbers(numbers: List[int]):
    return sum(numbers)


# function with changed input arguments and function body
def sum_numbers(a: int, b: int) -> int:
    return a + b

用户应该能够使用numbers: List[int] 参数或使用a: int, b: int 调用sum_numbers。但是,我想在用户使用原始调用方法时提交DeprecationWarning。

【问题讨论】:

    标签: python deprecated deprecation-warning


    【解决方案1】:

    一个选项是使用multipledispatch模块重载函数:

    from multipledispatch import dispatch
    
    @dispatch(int, int)
    def sum_numbers(a, b):
        print("Deprecated")
        return a + b
    
    @dispatch(list)
    def sum_numbers(numbers):
        return sum(numbers)
    

    【讨论】:

      【解决方案2】:

      multipledispatch 的替代方法是接收 *args 或有一个可选的 arg 并在内部调度:

      # original function
      def sum_numbers(a, b=None):
          if isinstance(a, list):
              warnings.warn("...", DeprecationWarning, stacklevel=2)
              return sum(numbers)
          return a + b
      

      那么你可以使用typing.overload:

      @typing.overload
      def sum_numbers(numbers: list[int]) -> int:
          """deprecated"""
      @typing.overload
      def sum_numbers(a: int, b: int) -> int:
          ...
      

      (请注意,如文件所述,重载应该在前,实际实现在后)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        相关资源
        最近更新 更多