dynamic - 动态语言的类型检查

标签 dynamic

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

最佳答案

在某些情况下,您需要进行类型检查。举例来说,您想要使用迭代器,但字符串 - 这是一种非常常见的情况。进行该检查的最佳方法是键入 check 项目是否为字符串:

if isinstance(someobj, str):  # basestring in 2.x
    ...

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

还值得注意的是,Python 允许定义 abstract base classes使用子类钩子(Hook) - 这允许 isinstance() 进行一种鸭子类型检查,其中检查类是否有所需的相关方法。例如,如果您想检查某个东西是否是序列,那么执行 isinstance(obj, collections.Sequence) 就不错,因为它实际上并不是传统类型中的类型检查。从某种意义上说,它检查对象是否具有序列接口(interface)所需的功能(如 in the docs 所定义)。

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

简而言之:在动态语言中,我们依赖于鸭子类型。如果一个物体可以嘎嘎叫,我们就可以假设它是一只鸭子。 99%的情况下,可以嘎嘎叫的物体可以被当作鸭子,所以我们没问题。然而,在极少数情况下,另一种可以嘎嘎叫的动物不应被视为鸭子。我们区分它们的唯一方法是键入 check,这样就可以了。然而,类型检查不应该用于检查我们的动物是否可以嘎嘎叫,因为我们可以尝试看看(或者,如果我们现在不能让它嘎嘎叫,但仍然需要依赖它进行操作,请直接检查嘎嘎叫的能力,而不是检查我们知道可以嘎嘎叫的类型)。

关于dynamic - 动态语言的类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16406813/

相关文章:

javascript - 在javascript中动态生成id引用的问题

java - 如何以编程方式或动态地在 JSF 2 中创建复合组件

c - 释放先前分配的内存后程序中止

C++在不同的函数中重新分配指向动态内存中数组的指针

css - 如何根据将您带到该站点的 url 在 Symfony2 中获取特定于客户的配色方案

arrays - 在 bash 中将 argv 条目附加到数组(动态填充数组)

algorithm - 关于分配,动态规划。让我的代码更有效率?

ios - UIWebview的动态加载

dynamic - Clojure 是单类型的吗?

css - 如何动态更改 UI 中的字体大小以在 JavaFX 中始终保持相同的宽度?