在python中测试两个函数的相等性

dol*_*eng 4 python equality metaprogramming function

我想让两个函数彼此相等,如下所示:


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
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我知道我可以覆盖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 = {}
Run Code Online (Sandbox Code Playgroud)

通过这种方式可以保证只有一个函数用于相同的签名值(有点像单例).但我真的在寻找一些更整洁的解决方案.

NPE*_*NPE 6

如果将函数转换为某些类的实例__call__()以及比较运算符,则可以很容易地实现所需的语义.