gpt4 book ai didi

python - RPython 中的静态类型是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:28:58 32 4
gpt4 key购买 nike

人们经常说 RPython (Python 的一个子集)是静态类型的。 (例如在 Wikipedia 上。)

最初,我想知道他们如何将其添加到 Python 中,并认为他们可能已经添加了在每个函数的开头添加诸如 assert isinstance(arg1, ...) 之类的语句的要求(但我真的不敢相信)。

然后我查看了一些 RPython 代码,它看起来根本不是静态类型的。在许多情况下,编译器可能会证明函数参数只能是特定类型,但绝对不是在所有情况下。

例如,这是 string.split 的 RPython 实现:

def split(value, by, maxsplit=-1):
bylen = len(by)
if bylen == 0:
raise ValueError("empty separator")

res = []
start = 0
while maxsplit != 0:
next = value.find(by, start)
if next < 0:
break
res.append(value[start:next])
start = next + bylen
maxsplit -= 1 # NB. if it's already < 0, it stays < 0

res.append(value[start:len(value)])
return res

在关于 RPython 的 PyPy 文档中,它说:“变量应该包含最多一种类型的值”。

那么,函数参数也算作变量吗?或者在什么意义上 RPython 是静态类型的?或者这实际上是误报?

最佳答案

So, do function arguments also count as variables?

当然有。他们总是使用几乎所有语言。

Or in what sense is RPython statically typed? Or is this actually misstated?

这个说法是正确的。 RPython 不是 Python。 嗯,它是它的一个子集,可以作为 Python 代码运行。但是当你实际编译 RPython 代码时,你会失去很多动态性(尽管只是在导入时间之后,所以你仍然可以使用元类,从字符串生成代码等 - 在某些模块中效果很好)编译器(它不是 Python 编译器,但与传统编译器有很大不同;请参阅相关文档)确实可以决定静态使用的类型。更准确地说,使用动态性的代码可以通过解析器和所有内容,但在某些时候会导致类型错误。

In many cases, it might be that the compiler can prove that a function argument can only be of certain types but definitely not in all cases.

当然不是。有很多代码不是静态类型的,并且当前注释器无法证明相当多的静态类型代码是静态类型的。但是当遇到这样的代码时,这是一个编译错误,期间。

有几点需要注意:

  • 类型是推断出来的,没有明确说明(好吧,在大多数情况下;我相信有一些函数需要断言来帮助注释者)。静态类型并不(正如您似乎在评论中暗示的那样)意味着必须写出类型(这称为 list 类型),这意味着每个表达式(包括变量)都有一个永不改变的类型。

  • 所有分析都是在整个程序的基础上进行的!无法推断函数的(非泛型)类型 def add(a, b): return a + b (参数可能是整数、 float 、字符串、列表等),但是如果使用整数参数调用函数(例如整数文字或先前推断包含整数的变量),则确定 ab(并且,由+的类型,add的结果也是整数。

  • 并非 PyPy 存储库中的所有代码都是 RPython。例如,有些代码生成器(例如在 rlib.parsing 中)在编译时运行并生成 RPython 代码,但不是 RPython(通常带有 "NOT_RPYTHON" 文档字符串, 顺便一提)。此外,大部分标准库都是用完整的 Python 编写的(大部分直接取自 CPython)。

关于整个翻译和打字的实际​​工作原理,有很多非常有趣的资料。例如,The RPython Toolchain描述了一般的翻译过程,包括类型推断和 The RPython Typer描述了所使用的类型系统。

关于python - RPython 中的静态类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7161856/

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