Alb*_*ert 13 python pypy static-typing rpython
通常声称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
Run Code Online (Sandbox Code Playgroud)
在关于RPython的PyPy文档中,有人说:" 变量应该包含最多一种类型的值 ".
那么,函数参数也算作变量吗?或者在什么意义上RPython静态输入?或者这实际上是错误的?
小智 14
那么,函数参数也算作变量吗?
他们当然会这样做.他们总是使用几乎所有语言.
或者在什么意义上RPython静态输入?或者这实际上是错误的?
声明是对的.RPython不是Python.好吧,它是它的一个子集,可以作为Python代码运行.但是当你真正编译RPython代码时,你会消除很多动态性(尽管只是在导入时间之后,所以你仍然可以使用元类,从字符串生成代码等等 - 在某些模块中用得很有效)编译器(这不是 Python编译器,但与传统编译器有很大不同;请参阅相关文档)确实可以确定静态使用的类型.更准确地说,使用动态性的代码使它通过解析器和所有内容,但在某些时候会导致类型错误.
在许多情况下,可能是编译器可以证明函数参数只能是某些类型,但绝对不是在所有情况下.
当然不是.有很多代码不是静态类型的,而且很多静态类型的代码当前的注释器无法被证明是静态类型的.但是当这样的代码被发现时,它就是编译错误,期间.
有几点非常重要:
类型是推断的,没有明确说明(嗯,大多数情况下;我相信有一些函数需要断言来帮助注释器).静态类型不会(正如您在评论中暗示的那样)意味着必须写出类型(称为清单类型),这意味着每个表达式(包括变量)都有一个永不改变的类型.
所有分析都是在整个程序的基础上进行的!无法推断函数的(非泛型)类型def add(a, b): return a + b(参数可能是整数,浮点数,字符串,列表等),但是如果使用整数参数调用函数(例如整数文字或先前推断的变量)要包含整数),确定a和b(以及+结果的类型add)也是整数.
并非PyPy存储库中的所有代码都是RPython.例如,有一些代码生成器(例如in rlib.parsing)在编译时运行并生成RPython代码,但不是RPython(顺便提一下,通常使用"NOT_RPYTHON"docstring).此外,标准库的大部分内容都是用完整的Python编写的(大部分直接来自CPython).
关于整个翻译和打字实际上是如何运作的,有很多非常有趣的材料.例如,RPython工具链一般描述了翻译过程,包括类型推断,RPython Typer描述了所使用的类型系统.
| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |