经常有人说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在关于PyPy的RPython文档中,有人说:“变量最多应该包含一种类型的值”。
那么,函数参数也算作变量吗?或者,在什么意义上,RPython是静态类型的?或者这实际上是说错了?
发布于 2011-08-23 14:06:55
那么,函数参数也算作变量吗?
他们当然知道。他们总是用几乎每一种语言。
或者,在什么意义上,RPython是静态类型的?或者这实际上是说错了?
这句话是对的。RPython不是,是它的一个子集,可以作为代码运行。但是,当您实际编译RPython代码时,大量的动态性会从您身上消失(尽管只是在导入之后,所以您仍然可以使用元类、从字符串生成代码等等--在某些模块中效果很好),编译器(即而不是编译器,但与传统编译器有很大不同;参见相关文档)确实可以决定静态使用类型。更准确地说,使用动态性的代码使其通过解析器和所有内容,但在某一点上会导致类型错误。
在许多情况下,编译器可能可以证明函数参数只能是某些类型,但在所有情况下都不能。
当然不是。有许多代码不是静态类型的,而当前注解器无法证明是静态类型化的一些静态类型的代码。但是,当这样的代码被引用时,它就是编译错误,句号。
有几点是重要的,需要认识到:
def add(a, b): return a + b的a(非泛型)类型(参数可能是整数、浮点数、字符串、列表等),但是如果函数是用整数参数调用的(例如,整数文本或先前推断为包含整数的变量),则确定a和b (以及,根据+的类型,add的结果)也是整数。rlib.parsing中)在编译时运行并生成RPython代码,但不是RPython (顺便说一句,它经常带有"NOT_RPYTHON"文档字符串)。此外,标准库的大部分都是用完整的Python编写的(大部分是直接取自CPython)。关于整个翻译和打字是如何工作的,有很多非常有趣的材料。例如,RPython工具链一般描述翻译过程,包括类型推断,而RPython打字机描述所使用的类型系统。
发布于 2011-08-23 14:03:30
是的,它是静态打印的。在您的示例中,所有变量都不改变类型,这在这方面满足了RPython的要求。RPython没有正式定义,它的限制也在不断演变,但是文档仍然是一个很好的起点。读完一段之后,最好的方法就是翻译一些代码,你会发现什么是你能做的,哪些不能做得很快!
https://stackoverflow.com/questions/7161856
复制相似问题