3 つの関数を登録したメソッド ディスパッチ デコレータがあります。1 つが にディスパッチされint
、正常に動作します。カスタムタイプでディスパッチされた 2 番目も問題なく動作します。3 番目もカスタム タイプですが、Class は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 を作成したコマンドをいくつかの異なる方法で呼び出して、それを変数に割り当ててみました。それでもうまくいきません。Augmented 関数で明示的な型チェックを試みました。キャッシュが有効になっている場合、タイプチェックもそこで失敗します。