我的软件包当前具有类似以下功能: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')
它并不完全向后兼容,因为函数签名不同,自省也不同,但是它将同时支持关键字参数和位置参数。如果您有很多参数(尤其是默认值),则可能会有些混乱。
您可以包括额外的检查,以确保用户不会同时提供两个关键字参数,也不会同时提供位置参数和关键字。许多库甚至不包含弃用警告,它们只是增加主要版本并在发行说明中指出更改。我认为保持代码整洁,易于理解并告诉用户仅吸收和更新他们的代码要比使代码更难阅读和增加错误的机会好得多。
关于python - 通过弃用周期切换参数名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35930005/