Python类型检查和继承问题

2024-10-01 17:37:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些Python代码,它依赖于类型检查。我试着用数学的语言来表达我的问题,这样就清楚了。我有几个类,它们相互对应,形成一个继承链。在

class Real(object):
    pass

class Integer(Real):
    pass

class Natural(Integer):
    pass

我有一个包含类型的元组。每一个都对应于某个函数的域。在

^{pr2}$

我想进行某种形式的类型检查,这样如果元组中的每个坐标都是指定域的子类,则给出另一个元组( Natural , Natural )。例如,对于某个函数getcompatibles,我希望:

getcompatibles( ( Real, Real ) ) = [ t1 ]
getcompatibles( ( Real, Integer ) ) = [ t1, t2 ]
getcompatibles( ( Natural, Natural ) ) = [ t1, t2 ]
getcompatibles( ( Natural, Real ) ) = [ t1 ]

我能想到的唯一解决方案是运行everyfordomain(t1,t2),遍历__subclasses__中的每一个类型,并检查它对于给定的输入是否为真。在

不过,这是极其低效的,有没有一种更像Python的方法呢?在


Tags: 函数代码语言类型object数学passinteger
2条回答

当您不必检查类型,也不需要依赖异常处理-使用try/except来捕捉违反期望的实例。在

在Python中,这是一种“懒散类型”(但是强类型,我不太打乱纯粹主义者)语言,反复调用isinstance肯定会增加开销。当我面对这样的设计问题时,我问自己的问题是“如果你不想让这个函数处理成对的自然对象,你为什么用它们来调用它?”假设您正在执行某种基于is_兼容谓词的条件分支,我建议您将其更改为条件调用。在

看看你打算如何使用is峎兼容的结果,会让你有一个更集中的答案。在

def compatible_pred(obj_types, fun_signature):
  if len(obj_types) != len(fun_signature): return False
  return all(issubclass(of, ft) for of, ft in zip(obj_types, fun_signature))

def is_compatible(obj_types, fun_signatures=(t1, t2)):
  return [t for t in fun_signatures if compatible_pred(obj_types, t)]

对于那些不属于谓词的事物,is_compatible的名称确实非常令人困惑:为什么不给它一个合理的名称,比如getcompatibles,这样听起来很强的谓词{}就可以用来代替我不得不给它起的名字compatible_pred?在

相关问题 更多 >

    热门问题