装饰后更新单调度过载

时间:2018-10-18 11:28:28

标签: python python-decorators single-dispatch

前言

我正在将single dispatchingfunctools.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

0 个答案:

没有答案