что статически типизировано в 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? Или это на самом деле ошибочно?

2 Solutions collect form web for “что статически типизировано в RPython?”

Итак, аргументы функции также считаются переменными?

Конечно. Они всегда делают практически на каждом языке.

Или в каком смысле статично типизирован RPython? Или это на самом деле ошибочно?

Утверждение верно. RPython не является Python. Ну, это подмножество и может быть запущено как код Python. Но когда вы на самом деле компилируете код RPython, так много динамичности отнимается у вас (хотя и только после времени импорта, поэтому вы все равно можете использовать метаклассы, генерировать код из строк и т. Д., Которые были использованы в некоторых модулях), что компилятор ( который не является компилятором Python, но значительно отличается от традиционных компиляторов, см. соответствующую документацию), действительно может решить, что типы используются статически. Точнее, код, который использует динамичность, заставляет его пройти парсер и все, но в какой-то момент приводит к ошибке типа.

Во многих случаях может быть, что компилятор может доказать, что аргумент функции может быть только определенного типа, но определенно не во всех случаях.

Конечно нет. Существует много кода, который не является статически типизированным, и довольно некоторый статически типизированный код, который не может быть статически введен в текущий аннотатор. Но когда такой код исправляется, это ошибки компиляции, период.

Есть несколько моментов, которые важны для реализации:

  • Типы выводятся, не указывается явно (ну, по большей части, я считаю, что есть несколько функций, которые требуют утверждений, чтобы помочь аннотатору). Статическая типизация не означает (как вы, кажется, подразумеваете в комментарии), означает, что тип должен быть выписан (это называется отображением символов), это означает, что каждое выражение (включающее переменные) имеет один тип, который никогда не изменяется.

  • Весь этот анализ происходит на основе всей программы! Нельзя вывести (не общий) тип для функции def add(a, b): return a + b (аргументы могут быть ints, float, строки, списки и т. Д.), Но если функция вызывается с целочисленные аргументы (например, целые литералы или переменные, которые ранее предполагались содержать целые числа), определяется, что a и b (и по типу + , результат add ) также являются целыми числами.

  • Не весь код в репозитории PyPy – это RPython. Например, есть генераторы кода (например, в rlib.parsing ), которые выполняются во время компиляции и производят код RPython, но не являются RPython (часто с docstring "NOT_RPYTHON" , кстати). Кроме того, большие части стандартной библиотеки написаны в полном Python (в основном, взяты прямо из CPython).

Есть очень много интересного материала о том, как работает весь перевод и ввод текста. Например, Toolchain RPython описывает процесс перевода в целом, включая вывод типа, и RPython Typer описывает используемую систему типов.

Да, это статически типизировано. В вашем примере ни один из переменных не меняет тип, который соответствует требованиям RPython в этом отношении. RPython формально не определен, и его ограничения постоянно меняются , но документация по-прежнему остается хорошим местом для начала. После небольшого чтения, лучше всего попробовать и перевести код, вы поймете, что вы можете и не можете сделать довольно быстро!

 
Interesting Posts for Van-Lav

Используя RabbitMQ, есть ли способ посмотреть содержимое очереди без деактивации?

Преобразование цветового пространства PIL YCbCr -> RGB

Пользовательские пики PyCharm docstring (то есть для форматов google docstring или numpydoc)

Что является первым шагом к получению электронной почты в моем коде приложения python / flask?

`make install` с CMake + SWIG + Python

ткань env.hosts не идентифицируется

Как обслуживать различные настройки конфигурации в флеш-приложении для uwsgi с помощью create_app?

как добавить библиотеку json

itertools.tee на сопрограмме?

Как построить градиентную линию цвета в matplotlib?

Как получить объединение двух списков, используя понимание списка?

Загрузить изображение, доступное на общедоступном URL-адресе S3, с помощью boto

pkg_resources.DistributionNotFound: Django == 1.3.1 при создании нового проекта в Django

Создание и импорт вспомогательных функций в тестах без создания пакетов в тестовой директории с использованием py.test

Форматирование ints в строку hex

Python - лучший язык программирования в мире.