如何弃用函数输入参数并保持向后兼容性
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:
...
(请注意,如文档所述,重载应该放在第一位,实际实现放在最后)
我想更改函数的输入参数。这也将导致函数体内的变化。 什么是将输入参数标记为“已弃用”并同时保持向后兼容性的 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:
...
(请注意,如文档所述,重载应该放在第一位,实际实现放在最后)