我正在将single dispatching与functools.singledispatch
decorator一起使用
from functools import singledispatch
from typing import Any
@singledispatch
def serialize(object_: Any) -> str:
raise TypeError('Serialization for objects '
'of type "{type}" is not supported.'
.format(type=type(object_)))
@serialize.register(int)
def serialize_int(object_: int) -> str:
return str(object_)
现在我是否要像这样有条件装饰serialize_int
log_int_overload = True # some condition here
if log_int_overload:
from functools import wraps
def log(function):
@wraps(function)
def wrapped(*args, **kwargs):
result = function(*args, **kwargs)
print('For {args}, {kwargs} function returned: {result}.'
.format(args=args,
kwargs=kwargs,
result=result))
return result
return wrapped
serialize_int = log(serialize_int)
然后打电话
>>> serialize(1)
'1'
如我们所见,调用了“旧”未修饰的版本。发生这种情况是因为我们仅注册了“旧的”一个重载,而serialize
对修饰的一无所知,因为它是一个新的函数对象。
如何修改重载,以便“调度程序”功能可以捕获更改?
我了解到我们可以在修饰后重新注册serialize_int
,但这看起来像是代码重复问题,还有其他方法吗?
或更笼统地说:我们可以以某种方式就地修改函数对象吗?装饰__call__
属性won't help。