如何弃用函数输入参数并保持向后兼容性

How to deprecate a function input argument and maintain backward compatibility

我想更改函数的输入参数。这也将导致函数体内的变化。 什么是将输入参数标记为“已弃用”并同时保持向后兼容性的 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

一个选项是使用 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)

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:
    ...

(请注意,如文档所述,重载应该放在第一位,实际实现放在最后)