gpt4 book ai didi

python - 什么时候 Python 无法在运行前确定对象的类型?

转载 作者:行者123 更新时间:2023-11-28 20:41:03 25 4
gpt4 key购买 nike

动态类型的缺点之一是无法在运行前知道类型。但在我看来,如果给出了完整的源代码,应该有一些(可能尚未开发)方法来测试代码中的每种情况,这样运行时崩溃的可能性就会降低。这在什么时候是不可能的?

最佳答案

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

def foo(x):
return x * 3

在这种情况下,任何实现了 __mul__ 的类型都可以作为候选。在内置函数中,这包括 intfloatcomplexlonglisttuplestringunicodebytearraybuffer

如果我们在前面的示例中添加更多上下文,类型推断的工作原理就会变得更加清晰:

def foo(x):
return x * 3

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

在这种情况下,我们可以简单地通过使用 copy propagation 来执行此检查,我们看到我们将 y 传递给 foo,我们知道它包含 "hello",因此,在这种情况下, 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"???

在这种情况下,我们最多只能说它是 stringint。由于添加了这个条件(基于 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 是一种静态类型语言。

关于python - 什么时候 Python 无法在运行前确定对象的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com