通过弃用周期切换参数名称?

switch argument name through deprecation cycle?

我的包目前有一个类似这样的功能:

def do_something(customer): customer_id = customer.id if isinstance(customer, Customer) else customer ...

我想对参数类型更加严格,并将其替换为:

def do_something(customer_id): ...

但是,我要非常小心,不要在没有经过弃用周期的情况下破坏用户的代码。在条件中添加弃用警告(然后删除整个条件)对于大多数用途来说就足够了,但有些用户可能会将我的 customer 参数作为关键字参数传递,在这种情况下,我的更改会破坏他们的代码。

有什么方法可以将我的参数名称从 customer 转换为 customer_id,同时不破坏任何代码,除非通过旧代码仍然有效的弃用周期?

我认为弃用和主要版本更改没问题。您可以同时支持使用 *args**kwargs.

def do_something(*args, **kwargs):
    if args:
        customer_id = args[0]
    elif 'customer' in kwargs:
        customer_id = kwargs['customer']
    elif 'customer_id' in kwargs:
        customer_id = kwargs['customer_id']
    else:
        raise TypeError('Expected customer_id')

它不完全向后兼容,因为函数签名不同,内省也会不同,但它会同时支持关键字参数和位置参数。如果你有很多参数(尤其是默认参数),它会变得有点混乱。

您可以包括额外的检查,以确保人们不会提供 both 个关键字参数,或者提供位置参数和关键字参数。许多库甚至不包含弃用警告,它们只是增加主要版本并在发行说明中指出更改。我认为让你的代码保持干净和易于理解并告诉你的用户接受它并更新他们的代码比让你的代码更难阅读和增加错误的机会要好得多。