首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RPython中静态输入的是什么?

在RPython中静态输入的是什么?
EN

Stack Overflow用户
提问于 2011-08-23 13:36:49
回答 2查看 1.7K关注 0票数 14

经常有人说RPython (Python的一个子集)是静态类型的。(例如关于维基百科.)

最初,我想知道他们如何将其添加到Python中,并认为他们可能已经在每个函数的开头添加了诸如assert isinstance(arg1, ...)之类的语句(但我真的不敢相信)。

然后我看了一些RPython代码,它看起来一点也不静态。在许多情况下,编译器可能可以证明函数参数只能是某些类型,但在所有情况下都不能。

例如,这是RPython实现的string.split

代码语言:javascript
复制
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是静态类型的?或者这实际上是说错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-23 14:06:55

那么,函数参数也算作变量吗?

他们当然知道。他们总是用几乎每一种语言。

或者,在什么意义上,RPython是静态类型的?或者这实际上是说错了?

这句话是对的。RPython不是,是它的一个子集,可以作为代码运行。但是,当您实际编译RPython代码时,大量的动态性会从您身上消失(尽管只是在导入之后,所以您仍然可以使用元类、从字符串生成代码等等--在某些模块中效果很好),编译器(即而不是编译器,但与传统编译器有很大不同;参见相关文档)确实可以决定静态使用类型。更准确地说,使用动态性的代码使其通过解析器和所有内容,但在某一点上会导致类型错误。

在许多情况下,编译器可能可以证明函数参数只能是某些类型,但在所有情况下都不能。

当然不是。有许多代码不是静态类型的,而当前注解器无法证明是静态类型化的一些静态类型的代码。但是,当这样的代码被引用时,它就是编译错误,句号。

有几点是重要的,需要认识到:

  • 类型是推断的,而不是明确声明的(嗯,大部分情况下,我认为有一些函数需要断言来帮助注释器)。静态类型(正如您在注释中所暗示的那样)并不意味着必须写出该类型(这称为清单类型),它意味着每个表达式(包括变量)都有一个永不更改的类型。
  • 所有这些分析都是在整个程序的基础上进行的!不能推断函数def add(a, b): return a + b的a(非泛型)类型(参数可能是整数、浮点数、字符串、列表等),但是如果函数是用整数参数调用的(例如,整数文本或先前推断为包含整数的变量),则确定ab (以及,根据+的类型,add的结果)也是整数。
  • 并非PyPy存储库中的所有代码都是RPython。例如,有一些代码生成器(例如,在rlib.parsing中)在编译时运行并生成RPython代码,但不是RPython (顺便说一句,它经常带有"NOT_RPYTHON"文档字符串)。此外,标准库的大部分都是用完整的Python编写的(大部分是直接取自CPython)。

关于整个翻译和打字是如何工作的,有很多非常有趣的材料。例如,RPython工具链一般描述翻译过程,包括类型推断,而RPython打字机描述所使用的类型系统。

票数 15
EN

Stack Overflow用户

发布于 2011-08-23 14:03:30

是的,它是静态打印的。在您的示例中,所有变量都不改变类型,这在这方面满足了RPython的要求。RPython没有正式定义,它的限制也在不断演变,但是文档仍然是一个很好的起点。读完一段之后,最好的方法就是翻译一些代码,你会发现什么是你能做的,哪些不能做得很快!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7161856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档