以动态语言键入检查

Rob*_*elo 3 dynamic

众所周知,当我们使用Python等动态语言时,我们不必担心类型.因为动态类型让我们无需担心.即便如此,我们也可以使用函数知道变量的类型type()(在Python中).所以我的问题是:用动态语言进行类型检查有什么好处?

Gar*_*tty 8

在某些情况下,类型检查是您想要做的事情.比如说,你想使用迭代器,但不是字符串 - 这是一个非常常见的情况.进行检查的最佳方法是键入检查项目是否为字符串:

if isinstance(someobj, str):  # basestring in 2.x
    ...
Run Code Online (Sandbox Code Playgroud)

我们使用isinstance()它,因为它允许子类以及类本身的实例.直接使用检查type()通常是一个非常糟糕的想法,但type()确实有其他用途 - 有时你想要出于类型检查以外的原因访问实例的类.

值得注意的是,Python允许使用子类钩子定义抽象基类 - 这允许isinstance()进行一种鸭类型检查,其中检查类是否需要相关方法.例如,如果你想检查某个是一个序列,那么做isinstance(obj, collections.Sequence)不错,因为它实际上不是传统意义上的类型检查,它会检查对象是否具有序列接口所需的功能(如文档中所定义) .

但是,通常应避免类型检查.在大多数情况下,可以简单地尝试并执行您想要的操作,然后在对象无法执行所需操作时捕获异常.Python通常遵循请求宽恕而不是许可的规则,因此请尝试并优雅地处理错误,而不是事先进行检查.

简而言之:在动态语言中,我们依赖于鸭子打字.如果一个物体可以嘎嘎叫,我们可以认为它是一只鸭子.99%的时间,可以嘎嘎叫的对象可以被视为鸭子,所以我们没事.然而,在极少数情况下,另一种可以嘎嘎叫的动物不应该被视为鸭子.我们可以区分它们的唯一方法是键入check,这没关系.不应该使用类型检查来检查我们的动物是否可以嘎嘎叫,但是,正如我们可以试着看到的那样(或者,如果我们现在不能使它嘎嘎叫,但仍然需要根据它进行操作,请直接检查嘎嘎的能力,而不是检查我们知道可以嘎嘎叫的类型.