Python何时无法在运行时确定对象的类型?

rb612

动态类型化的缺点之一是无法在运行时知道类型。但是在我看来,给定完整的源代码,应该有某种(可能尚未开发)测试代码中每种情况的方法,因此运行时崩溃的可能性较小。什么时候不可能?

迈克尔·雷卡纳斯(Michael Recachinas)

类型推断可能不明确的另一种情况是,如果整个程序由

def foo(x):
    return x * 3

在这种情况下,实现的任何类型__mul__都可以作为此类型的候选。出建宏,这包括intfloatcomplexlonglisttuplestringunicodebytearraybuffer,等。

如果在前面的示例中添加更多上下文,则类型推断将如何工作变得更加清楚:

def foo(x):
    return x * 3

y = "hello"
foo(y) #=> "hellohellohello"

在这种情况下,我们可以简单地通过使用复制传播来执行此检查,在复制传播y,我们知道传入的是包含的"hello"foo因此,在这种情况下,foo(x)可以推断为foo(x: string) -> string

不幸的是,正如@Pablo所指出的,只要我们添加一个条件,就可以再次推断类型:

def foo(x):
    return x * 3

y = "hello"

if some_other_function():
    y = 3

foo(y) #=> 9 or "hellohellohello"???

在这种情况下,我们可以说的最好是astring或an int由于添加了此条件(基于的结果some_other_function()),我们不知道是否会达到foo(y),如果这样做,我们将不知道y将是哪种类型

在JavaScript(另一种鸭子类型的语言,其类型系统比Python弱)中,诸如Facebook的Flow之类的工具可以执行合理的静态类型检查。Flow支持类型注释,以进一步帮助其分析,但如果没有它们,效果很好。同样,Python 3中的函数注释当然可以帮助这种静态分析。即使没有注释,类型检查工具似乎已经存在(请参阅:https : //stackoverflow.com/questions/35470/are-there-any-static-analysis-tools-for-python)。一个例子是PySonar2

最后,Python当然可以执行此推断。在这种情况下,解释Python的事实没有任何意义。OCaml具有编译器附带的解释器,但OCaml是静态类型的语言。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++在运行时确定多态对象的类型

来自分类Dev

在运行时确定对象类型-C#

来自分类Dev

在运行时无法投射对象

来自分类Dev

在运行时确定或访问类型变量的具体类型

来自分类Dev

在运行时确定或访问类型变量的具体类型

来自分类Dev

无法反序列化int List <type>,其中类型是在运行时确定的

来自分类Dev

飞镖:在运行时确定/检查列表类型

来自分类Dev

在运行时将对象转换为通用类型

来自分类Dev

如何在运行时获取对象类型?

来自分类Dev

在运行时将对象转换为通用类型

来自分类Dev

在运行时获取对象的父类型

来自分类Dev

确定运行时对象类型的最佳方法

来自分类Dev

数组大小在运行时确定

来自分类Dev

数组大小在运行时确定

来自分类Dev

在运行时从python Literal类型中获取文字?

来自分类Dev

使用继承在运行时扩展Python对象

来自分类Dev

在运行时如何确定非多态类型的实际类型

来自分类Dev

是否可以在运行时确定对象选择的情况下使用C ++对象组成?

来自分类Dev

在运行时转换类型数组

来自分类Dev

在运行时获取输入类型

来自分类Dev

在运行时定义的类型的列表

来自分类Dev

使对象在运行时不可变

来自分类Dev

在运行时更改注入的对象

来自分类Dev

在运行时创建Command对象

来自分类Dev

在运行时创建对象?

来自分类Dev

在运行时替换QWidget对象

来自分类Dev

在运行时添加对象?

来自分类Dev

使对象在运行时不可访问

来自分类Dev

如何在运行时确定exception_ptr指向的异常类型?