Часто утверждается, что 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? Или это действительно неверно?