通常会说,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是静态类型的?或者说这是错的?
最佳答案
那么,函数参数也算变量吗?
当然有。他们总是用几乎所有的语言。
或者从什么意义上说,rpython是静态类型的?或者说这是错的?
这句话是正确的。rpython不是python。嗯,它是它的一个子集,可以作为Python代码运行。但是,当您实际编译rpython代码时,那么多的动态性就被剥夺了(尽管只有在导入之后,所以您仍然可以使用元类、从字符串生成代码等),在某些模块中用于产生巨大的效果),编译器(这不是python编译器,但有很大的不同从传统的编译器中;请参阅相关的文档)确实可以决定静态地使用类型。更准确地说,使用dynamicness的代码使它通过解析器和所有内容,但在某个时刻会导致类型错误。
在许多情况下,编译器可能会证明函数参数只能是某些类型的,但在所有情况下肯定不是。
当然不是。有很多不是静态类型的代码,还有很多静态类型的代码——当前的注释器不能证明是静态类型的。但是,当这样的代码没有计数时,这是一个编译错误,句号。
有几点很重要,需要认识到:
类型是推断的,而不是显式地声明的(好吧,在大多数情况下,我相信有一些函数需要断言来帮助注释器)。静态类型化并不意味着必须写出类型(这称为清单类型化),它意味着每个表达式(包括变量)都有一个永远不变的类型。
所有的分析都是在整个程序的基础上进行的!无法为函数推断(非泛型)类型(参数可能为int、float、字符串、列表等),但如果使用整数参数(例如,以前推断为包含整数的整型文本或变量)调用函数,则确定为def add(a, b): return a + b
和a
(and,by类型为b
,结果为+
)也是整数。
pypy存储库中的代码并非都是rpython。例如,有一些代码生成器(例如在add
中)在编译时运行并生成rpython代码,但不是rpython(顺便说一下,经常使用rlib.parsing
docstring)。另外,标准库的大部分都是用完整的python编写的(大部分是直接从cpython获取)。
关于整个翻译和打字是如何工作的,有很多非常有趣的材料。例如,The RPython Toolchain一般描述翻译过程,包括类型推断,The RPython Typer描述所使用的类型系统。
关于python - 在RPython中静态输入什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7161856/