2013-05-06 71 views
3

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

+1

尝试定义术语“动态语言”。提示:考虑“类型安全”或“弱类型”等相关术语。 – SLaks 2013-05-06 20:34:28

+0

你问'type()'函数有什么用处? – tMC 2013-05-06 20:36:30

+0

我一直在问动态语言中的类型检查@tMC – 2013-05-06 20:38:10

回答

8

有几种情况下类型检查是你想要做的事情。比方说,你想使用迭代器,但而不是字符串 - 这是一个很常见的情况。使该检查的最好方法是键入检查,如果该项目是一个字符串:

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,这是可以的。不应该使用类型检查来检查我们的动物是否可以嘎嘎,但是,正如我们可以试着看到的那样(或者,如果我们现在不能使它嘎嘎作响,但仍然需要依赖它进行操作,请直接检查能力嘎嘎,而不是检查我们知道可以嘎嘎的类型)。

0

考虑一个分层数据结构,其中每个节点可以是叶,表示为标量对象,或表示为阵列的子树。如果您正在编写处理所有叶子的函数,则可以使用递归算法检查每个节点的类型;如果它是一个数组,它会迭代它并递归,否则它会处理该节点。

1

在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' 

感谢您的阅读!

+0

这不是一个很好的类型检查的原因 - 一如既往,如果你需要一个可变序列,那么尝试它,如果你得到一个不可变的序列或者检查适当的ABC(它寻找必要的函数),就捕获异常。类型检查的原因是,如果你有一些*功能上*不可区分,但在上下文中不同 - 例如,如果你想将所有迭代器扁平化到n的深度,那么字符串将会导致无限递归,所以尽管事实上那些字符串是有效的迭代器,它们不应该被处理。在这种情况下,键入检查是有效的。 – 2013-05-06 20:59:26

+0

而你要所有的答案,并证明他们都错了......我想这条巨蟒控制台上: >>> isinstance(“lattyware”,__builtins __帮助.__ class__。) 假 这也解释了:)!我所说的也是由你的帖子“重复”,但无论如何,你让我们真的不可能说我们知道python。他问什么样的服务类型检查,并包括类型检查的每一个好处..我从来没有走过类型检查的情景..但反正你钝文字被视为动力! – 2013-05-06 21:17:14

相关问题