Часто утверждается, что RPython (подмножество Python ) имеет статический тип. (Например, в Википедии.)
Сначала я задавался вопросом, как они добавят это в Python, и подумал, что они, возможно, добавили требование добавлять операторы, такие как assert isinstance(arg1, ...)
, в начале каждой функции (но я не мог в это поверить).
Затем я посмотрел на некоторый код RPython, и он вообще не выглядит статически типизированным. Во многих случаях компилятор может доказать, что аргумент функции может быть только определенного типа, но определенно не во всех случаях.
Например, это реализация string.split
в RPython:
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 статически типизирован? Или это действительно искажено?
def add(a, b): return a + b
не является статически типизированной и даже может использоваться для нескольких разных типов. 23.08.2011