我有一个带有三个注册函数的方法调度装饰器。一个发送到int
,效果很好。在自定义类型上调度的第二个也可以正常工作。第三种也是自定义类型,只不过Class是用lru_cache
装饰器包裹的。
(为了让事情更复杂一点,这个类是通过另一个类的方法上的 methoddispatch 以一种迂回的方式实例化的__call__
。)
@lru_cache(maxsize=None, typed=True)
class QualifiedInterval:
# stuff that works
在 Pitch 类中:
@oph_utils.method_dispatch
def augmented(self, other):
raise NotImplementedError
@augmented.register(int)
def _(self, other):
return "works fine"
@augmented.register(Interval)
def _(self, other):
return "works fine too"
@augmented.register(QualifiedInterval)
def _(self, other):
return "only works if QualifiedInterval class does NOT have lru_cache"
(还有很多事情要做,但这是不起作用的部分。)
基本上 - 如果我有 lru_cache,并将 QualifiedInterval 传递给函数,它不会调度并引发 NotImplementedError。如果我注释掉缓存装饰器,它就可以工作。REPL 的手动类型检查显示相同的类型(“QualifiedInterval”)。我尝试以几种不同的方式调用创建 QualifiedInterval 的命令,并尝试将其分配给变量。还是不行。我尝试在增强函数中进行显式类型检查。如果启用了缓存,类型检查也会失败。