У меня есть декоратор диспетчеризации методов с тремя зарегистрированными функциями . Один отправляет на int
, который отлично работает. Второй разослал по кастомному типу, тоже нормально работает. Третий также является пользовательским типом, но класс обернут декоратором lru_cache
.
(Чтобы немного усложнить ситуацию, класс создается окольным путем через вызов метода в методе __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, несколькими разными способами и пытался присвоить ее переменной. Все еще не работает. Я пытался выполнить явную проверку типов в расширенной функции. Проверка типов также не проходит там, если включено кэширование.