我有一个类,它有(太多)很多方法。大多数方法都有一个参数(总是同名)——我需要将参数的类型更改为其他类型,但也想接受参数的“旧”版本(和 raise DeprecationWarning)。
编辑:我们可以假设参数总是作为关键字参数传递。
最DRY的方法是什么?
我想到的第一个解决方案是这样的:
def check_orc(orc):
if isinstance(Snaga, orc):
orc = convert_to_urukhai(orc)
raise DeprecationWarning("You should not be sending snaga to combat")
return orc
class Warrior():
def slash_orc(sword, shield, opponent):
opponent = check_orc(opponent)
...
def hack_orc(warhammer, opponent):
opponent = check_orc(opponent)
...
请您参考如下方法:
avasal 的评论是正确的。然而,出于教育目的,这里是您想要的装饰器实现:
from functools import wraps
def convert_orc(f):
@wraps(f)
def wrapper(self, opponent, *args, **kwargs):
if isinstance(Snaga, orc):
raise DeprecationWarning(...)
return f(self, convert_to_urukhai(opponent), *args, **kwargs)
else:
return f(self, opponent, *args, **kwargs)
return wrapper
class Warrior():
@convert_orc
def slash_orc(self, opponent, sword, shield):
...
@convert_orc
def hack_orc(self, opponent, warhammer):
...
注意:我把opponent移到了参数的第一个位置
