что статически типизируется в 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

В документации PyPy о RPython сказано: « переменные должны содержать значения не более одного типа ».

Итак, аргументы функции также считаются переменными? Или в каком смысле статически типизирован RPython? Или это действительно неверно?

13
задан Albert 23 August 2011 в 13:36
поделиться