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

标签 python function metaprogramming equality

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


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

我应该怎么做?我知道我可能会覆盖 <strong>eq</strong><strong>ne</strong>如果 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 = {}

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

最佳答案

如果您将您的函数转换为某个覆盖 __call__() 以及比较运算符的类的实例,那么将很容易实现您想要的语义。

关于python - 测试python中两个函数的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794714/

相关文章:

c - 在 C 中,有哪些方法可以使函数在其调用之间共享数据?

ruby - 如何在 Ruby 中使用 before 和 after 包装方法?

Groovy - 覆盖单个实例的 invokeMethod

python - 将不同文件夹中的多个 csv 文件中的选定列合并到单个 csv 文件中

python - 如何在 Python Cerberus 中将字符串强制转换为日期时间?

python - Python 中的聊天模拟器无法按预期工作

python - R/rpy2 中 as.dist 函数的内存问题

sql - 如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?

javascript - 功能/对象的范围

c++ - 我的代码如何区分编译时常量和变量?