人们经常说RPython(Python 的一个子集)是静态类型的。(例如在维基百科上。)
最初,我想知道他们如何将其添加到 Python 中,并认为他们可能已经添加了添加语句的要求,例如assert isinstance(arg1, ...)
在每个函数的开头(但我真的不敢相信)。
然后我查看了一些 RPython 代码,它看起来根本不是静态类型的。在许多情况下,编译器可能可以证明函数参数只能是某些类型,但绝对不是在所有情况下。
例如,这是 RPython 的实现string.split
:
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 是静态类型的?或者这实际上是错误的?