Ответ 1
Итак, аргументы функции также считаются переменными?
Конечно, да. Они всегда делают практически на каждом языке.
Или в каком смысле ставится типизированный тип RPython? Или это фактически неверно?
Утверждение верно. RPython не является Python. Ну, это его подмножество и может быть запущено как код Python. Но когда вы на самом деле компилируете код RPython, так много динамичности отнимается у вас (хотя и только после времени импорта, поэтому вы все равно можете использовать метаклассы, генерировать код из строк и т.д., Которые были использованы в некоторых модулях), что компилятор ( который не компилятор Python, но значительно отличается от традиционных компиляторов, см. соответствующую документацию), действительно может решить, что типы используются статически. Точнее, код, который использует динамичность, заставляет его пройти парсер и все, но в какой-то момент приводит к ошибке типа.
Во многих случаях может быть, что компилятор может доказать, что аргумент функции может быть только определенного типа, но определенно не во всех случаях.
Конечно нет. Там много кода, который не статически типизирован, и довольно некоторый статически типизированный код, текущий аннотатор не может быть статически типизирован. Но когда такой код изменяется, это ошибки компиляции, период.
Есть несколько моментов, которые важны для понимания:
-
Типы выводятся, не указаны явно (ну, по большей части, я считаю, что есть несколько функций, которые требуют утверждений, чтобы помочь аннотатору). Статическая типизация не означает (как вы, кажется, подразумеваете в комментарии), означает, что тип должен быть выписан (это называется отображением манифеста), это означает, что каждое выражение (включающее переменные) имеет один тип, который никогда не изменяется.
-
Все эти анализы происходят на основе всей программы! Нельзя вывести (не общий) тип для функции
def add(a, b): return a + b
(аргументы могут быть ints, floats, строки, списки и т.д.), Но если функция вызывается с целыми аргументами (например, целочисленными литералами или переменными, которые ранее предполагалось содержать целые числа), определяется, чтоa
иb
(и по типу+
результатadd
) также являются целыми числами. -
Не весь код в репозитории PyPy - это RPython. Например, есть генераторы кода (например, в
rlib.parsing
), которые выполняются во время компиляции и производят код RPython, но не являются RPython (часто с"NOT_RPYTHON"
docstring, кстати). Кроме того, большие части стандартной библиотеки написаны в полном Python (в основном, взяты прямо из CPython).
Там очень много интересного материала о том, как работает весь перевод и ввод текста. Например, Инструмент RPython Toolchain описывает процесс перевода в целом, включая вывод типа, и RPython Typer описывает используемую систему типов.