次のように、2つの関数を互いに等しくしたいと思います。
def fn_maker(fn_signature):
def _fn():
pass
_fn.signature = fn_signature
return _fn
# test equality of two function instances based on the equality of their signature values
>>> fa = fn_maker(1)
>>> fb = fn_maker(1)
>>> fc = fn_maker(2)
>>> fa == fb # should be True, same signature values
True
>>> fa == fc # should be False, different signature values
False
どうすればいいですか?私はおそらくオーバーライドできることを知ってeq
おりne
、fa、fb、fcがいくつかのクラスのインスタンスである場合。しかし、ここではeqはdir(fa)になく、リストを追加しても機能しません。キャッシュを使用するような回避策を見つけました。たとえば、
def fn_maker(fn_signature):
if fn_signature in fn_maker.cache:
return fn_maker.cache[fn_signature]
def _fn():
pass
_fn.signature = fn_signature
fn_maker.cache[fn_signature] = _fn
return _fn
fn_maker.cache = {}
このようにして、同じシグニチャ値に対して1つの関数のみが存在することが保証されます(シングルトンのようなものです)。しかし、私は本当にいくつかのきちんとした解決策を探しています。