Явно типизированная версия Python?
Мне скорее нравится синтаксический сахар Python; и стандартные библиотечные функции.
Однако одна особенность, которая мне не нравится; неявная типизация.
Есть ли дистрибутив Python с явной типизацией; который по-прежнему совместим, например, с пакетами на PyPi?
[Я смотрел в RPython]
5 ответов
Начиная с Python 3, возможность использовать аннотацию типов была введена в стандарт Python с помощью PEP 3017. Перемотка вперед на python 3.5 и PEP 0484 основаны на этом, чтобы ввести подсказку типа вместе с модулем ввода, который позволяет указывать типы для переменной или возвращаемого типа функции.
from typing import Iterator
def fib(n: int) -> Iterator[int]:
a, b = 0, 1
while a < n:
yield a
a, b = b, a + b
Пример выше взят из https://pawelmhm.github.io
Согласно 484 примечаниям:
Хотя эти аннотации доступны во время выполнения через обычный атрибут __annotations__, во время выполнения проверка типов не выполняется. Вместо этого в предложении предполагается наличие отдельной автономной проверки типов, которую пользователи могут добровольно запускать через свой исходный код. По сути, такая проверка типа действует как очень мощный линтер. (Хотя, конечно, для отдельных пользователей было бы возможно использовать аналогичную программу проверки во время выполнения для проектирования путем принудительного исполнения контракта или оптимизации JIT, эти инструменты еще не настолько развиты.)
Это подразумевает, что, хотя python предоставляет это средство "статической типизации", он не применяется во время выполнения, то есть когда вы запускаете свою программу, python просто игнорирует любые предоставленные вами спецификации типов и продолжает использовать утиную типизацию для вывода типов. Поэтому вам нужно найти что-то вроде проверки на наличие ворса, с помощью которой вы можете запустить вашу программу, чтобы обнаружить любые проблемы с типами.
Мотивация включения ввода в стандарт Python в основном зависит от mypy, поэтому, возможно, стоит проверить их. Они также предоставляют примеры, которые могут оказаться полезными.
Краткий ответ: нет. То, что вы просите, глубоко встроено в Python и не может быть изменено без изменения языка настолько радикально, что это не будет Python.
Я предполагаю, что вам не нравятся переменные, которые повторно вводятся при повторном назначении? Вы можете рассмотреть другие способы проверить это, если это проблема с вашим кодом.
Нет. Ты не можешь есть торт и есть торт.
Python великолепен, потому что он динамически типизирован! Период. (Вот почему у него такая хорошая стандартная библиотека тоже)
Есть только 2 преимущества статически типизированных языков: 1) скорость - когда алгоритмы подходят для начала и 2) ошибки компиляции
Что касается 1)
- Используйте PyPi,
- Профиль,
- Используйте ctype libs для отличной производительности.
Типично иметь всего 10% или менее кода, который критичен к производительности. Все эти другие 90%? Наслаждайтесь преимуществами динамического набора текста.
Что касается 2)
- Используйте классы (и контракты)
- Используйте модульное тестирование
- Использовать рефакторинг
- Используйте хороший редактор кода
Обычно данные НЕ УСТАНАВЛИВАЮТСЯ на стандартные типы данных, которые являются слишком строгими или слишком свободными в том, что они позволяют хранить в них. Убедитесь, что Вы проверяете свои данные самостоятельно.
Модульное тестирование должно быть для алгоритмического тестирования, которое ни один компилятор не может сделать для Вас, и должно отлавливать любые проблемы, возникающие из-за неправильных типов данных (и в отличие от компилятора они настолько детализированы, насколько это необходимо)
Рефакторинг решает все эти проблемы, когда вы не уверены, что данные изменения не повредят вашему коду (и опять же, строго типизированные данные также не могут этого гарантировать).
И хороший редактор кода может решить очень много проблем... Используйте Sublime Text некоторое время. И тогда Ты поймешь, о чем я.
(Конечно, я не даю Тебе ответа, который Ты хочешь получить. Скорее, я ставлю под сомнение Твои потребности, особенно те, которые Ты не включил в Твой вопрос)
Теперь, в 2021 году, есть библиотека под названием Deal , которая не только предоставляет надежную статическую проверку типов, но также позволяет указывать предварительные и постусловия, инварианты циклов, явно указывать ожидания в отношении исключений и операций ввода-вывода/побочных эффектов и даже формально доказать правильность кода (хотя и для небольшого подмножества Python).
Вот пример из их GitHub:
# the result is always non-negative
@deal.post(lambda result: result >= 0)
# the function has no side-effects
@deal.pure
def count(items: List[str], item: str) -> int:
return items.count(item)
# generate test function
test_count = deal.cases(count)
Теперь мы можем:
- Бежать
python3 -m deal lint
или flake8 для статической проверки ошибок. - Бежать
python3 -m deal test
или pytest для создания и запуска тестов. - Просто используйте функцию в проекте и проверяйте ошибки во время выполнения.
Поскольку комментарии ограничены...
Как интерпретируемый язык Python по определению слабо типизирован. Это не плохая вещь, скорее как средство управления для программиста для предотвращения потенциальных синтаксических ошибок, но на самом деле это не остановит появление логических ошибок и, таким образом, делает вопрос спорным.
Несмотря на то, что статья о RPython подчеркивает это, она сосредоточена на объектно-ориентированном программировании. Вы должны иметь в виду, что Python - это скорее объединение ООП и функционального программирования, вероятно, и других.
Я поощряю чтение этой страницы, это очень информативно.