Часто говорится, что RPython (подмножество Python) статически типизировано. (Например, на Wikipedia.)
Вначале я задавался вопросом, как они добавят это в 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 already < 0, it stays < 0
res.append(value[start:len(value)])
return res
В документации PyPy о RPython говорится: "переменные должны содержать значения не более одного типа".
Итак, аргументы функции также считаются переменными? Или в каком смысле статично типизирован RPython? Или это фактически неверно?