如何在不破坏函数库的情况下修改函数的签名

How to modify the signature of a a function without breaking it in a library

我正在构建我公司其他人正在使用的库。 该库中的一个函数示例是:

def foo(bar, *baz)

现在,我们想出了一个新的命名可选布尔参数 qux,我们想将其添加到 foo。 我试着在最后添加它:

def foo(bar, *baz, qux=False)

但这将不起作用,因为它是一个无效的语法(我的 IDE 甚至强调了这一点: * 参数 之后的常规参数)。 在 *baz 之前添加它可以正常工作:

def foo(bar, qux=False, *baz)

但这不是向后兼容的,它会破坏更新此库的每个开发人员的所有代码。

如何在不破坏所有同事应用程序的情况下将这个新参数添加到我的函数中?

他们是否都需要修改代码才能接受这个新功能?

*baz 是一个包罗万象的参数,您不能在此之后添加新的命名参数。作为解决方法,您可以执行以下操作:

def foo(bar, *baz, **kwargs):
    qux = kwargs.get("qux", False)
    # ... rest of your implementation

当然这不会帮助您 IDE 捕获调用此函数的错误,但您不必在任何地方修改它。