众所周知,当我们使用Python等动态语言时,我们不必担心类型。因为动态打字让我们无需担心就能工作。即使如此,我们可以使用函数type()
(以Python)知道变量的类型。所以我的问题是:使用动态语言进行类型检查有什么好处?以动态语言检查类型
回答
有几种情况下类型检查是你想要做的事情。比方说,你想使用迭代器,但而不是字符串 - 这是一个很常见的情况。使该检查的最好方法是键入检查,如果该项目是一个字符串:
if isinstance(someobj, str): # basestring in 2.x
...
我们用isinstance()
,因为它允许子类以及类本身的实例。直接使用type()
进行检查几乎普遍是一个可怕的想法,但type()
确实有其他用途 - 有时您想要访问除类型检查以外的其他原因的实例的类。
还值得注意的是,Python允许abstract base classes与子类钩子的定义 - 这允许isinstance()
做一种鸭子类型检查,其中类检查所需的相关方法。例如,如果你想查询的东西是一个序列,做isinstance(obj, collections.Sequence)
是不糟糕,因为它不是真正的类型检查在传统意义上,它会检查对象所具有的功能necesary的序列接口(定义in the docs )。
但是,通常应该避免类型检查。在大多数情况下,可以简单地尝试并按照自己的意愿进行操作,然后在对象无法执行所需操作时捕获异常。 Python一般遵循要求宽恕的规则,而不是许可,因此请尝试并优雅地处理错误,而不是事先检查。
总之:在动态语言,我们依靠鸭打字。如果一个物体可以嘎嘎,我们可以认为它是一只鸭子。 99%的时间,可以嘎嘎的东西都可以当作鸭子,所以我们很好。然而,在极少数情况下,另一只可以嘎嘎的动物不应该被当作鸭子来对待。我们可以区分它们的唯一方法是键入check,这是可以的。不应该使用类型检查来检查我们的动物是否可以嘎嘎,但是,正如我们可以试着看到的那样(或者,如果我们现在不能使它嘎嘎作响,但仍然需要依赖它进行操作,请直接检查能力嘎嘎,而不是检查我们知道可以嘎嘎的类型)。
考虑一个分层数据结构,其中每个节点可以是叶,表示为标量对象,或表示为阵列的子树。如果您正在编写处理所有叶子的函数,则可以使用递归算法检查每个节点的类型;如果它是一个数组,它会迭代它并递归,否则它会处理该节点。
在Python中一切都是“对象”,并继承了一些“属性”和“方法”,给它一个独特之处。
所以,类型是在的“方法”,并且它charecterize“属性”术语的对象的“分类”。换言之,类型检查可以根据 “方法”和“属性”为我们提供该对象的实用性。 python“list”是一个序列,python“string”是一个序列,但它们具有不同的属性(一个是可变的,另一个是不可变的),之后他们有独特的方法来处理它们的结构。例如,列表可以使用'append'和'pop'来增大或缩小,因为它们被禁止。一个字符串的表示可能会改变'大写'或'低'的列表可能无法正常工作。
>>> i = "" # i declared string here
>>> i.append("K")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'
>>> i.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'pop'
同样,
>>> a = [] # a declared a list here
>>> a.lower()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'lower'
>>> a.capitalize()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'capitalize'
感谢您的阅读!
这不是一个很好的类型检查的原因 - 一如既往,如果你需要一个可变序列,那么尝试它,如果你得到一个不可变的序列或者检查适当的ABC(它寻找必要的函数),就捕获异常。类型检查的原因是,如果你有一些*功能上*不可区分,但在上下文中不同 - 例如,如果你想将所有迭代器扁平化到n的深度,那么字符串将会导致无限递归,所以尽管事实上那些字符串是有效的迭代器,它们不应该被处理。在这种情况下,键入检查是有效的。 – 2013-05-06 20:59:26
而你要所有的答案,并证明他们都错了......我想这条巨蟒控制台上: >>> isinstance(“lattyware”,__builtins __帮助.__ class__。) 假 这也解释了:)!我所说的也是由你的帖子“重复”,但无论如何,你让我们真的不可能说我们知道python。他问什么样的服务类型检查,并包括类型检查的每一个好处..我从来没有走过类型检查的情景..但反正你钝文字被视为动力! – 2013-05-06 21:17:14
- 1. 动态类型语言中的类型
- 2. 动态类型语言中的文档
- 3. 口译员和动态类型语言
- 4. 用动态类型语言重构
- 5. 了解解释动态语言中的类型检测
- 6. 以动态类型语言(如Ruby)命名变量
- 7. 动态类型语言中的快速属性查找?
- 8. Objective-C语言语法 - “类型检查”常量字符串
- 9. 设计模式列表仅适用于静态类型语言,但不适用于动态类型语言?
- 10. 在动态类型语言中切换case语句
- 11. 泛型类型,编译器和动态语言
- 12. 在静态类型语言D中使用动态类型输入
- 13. 以动态检索记录类型值
- 14. 检查动态类型的变量android
- 15. PHP中的动态类型检查
- 16. 在列表中检查类型django模板语言
- 17. 检查来自数据库的数据的语言类型
- 18. 如何在运行时检查变量类型在Go语言
- 19. Prolog是一种无类型的语言吗? Prolog和动态类型语言有什么区别?
- 20. 静态类型语言是否可以支持异构列表?
- 21. Kivy,KV语言的动态类
- 22. JavaScript断言库 - 柴与检查类型
- 23. 静态类型语言的类型在运行时决定?
- 24. 动态类型语言和远程方法调用
- 25. 值得动态类型语言的所有批评?
- 26. 如何处理动态语言中的错误参数类型?
- 27. 如何在动态类型语言中描述函数参数?
- 28. 如何用动态类型语言指定参数类型,即Python?
- 29. 是不需要声明变量类型的弱语类型或动态类型示例的语言的质量
- 30. 自然语言类型的子类型
尝试定义术语“动态语言”。提示:考虑“类型安全”或“弱类型”等相关术语。 – SLaks 2013-05-06 20:34:28
你问'type()'函数有什么用处? – tMC 2013-05-06 20:36:30
我一直在问动态语言中的类型检查@tMC – 2013-05-06 20:38:10