我的包目前有一个类似的功能:
def do_something(customer):
customer_id = customer.id if isinstance(customer, Customer) else customer
...
我想对参数类型更加严格,并将其替换为:
def do_something(customer_id):
...
但是,我要非常小心,不要在不经过弃用周期的情况下破坏用户代码。在条件中添加弃用警告(然后删除整个条件)就足以满足大多数用途,但有些用户可能会将我的customer
参数作为关键字参数传递,在这种情况下,我的更改将破坏其代码。
有没有办法将我的参数名称从customer
转换为customer_id
,而不会破坏任何代码,除非通过旧代码仍然有效的弃用周期?
答案 0 :(得分:2)
我认为弃用和主要版本更改很好。您可以使用*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')
它并不完全向后兼容,因为函数签名是不同的,内省将是不同的,但它将支持关键字参数和位置参数。如果你有很多参数(尤其是默认值),它可能会变得混乱。
您可以添加额外的检查,以确保人们不提供两个关键字参数,或者在位置和关键字中提供参数。许多库甚至不包括弃用警告,它们只是递增主要版本并指示发行说明中的更改。我认为保持代码清洁易于理解并告诉用户只是简单地更新代码而不是让代码更难以阅读并增加错误的可能性要好得多。