【发布时间】:2023-03-28 11:15:02
【问题描述】:
经常说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 是静态类型的?或者这实际上是错误的?
【问题讨论】:
标签: python static-typing pypy rpython