Инструменты для статической проверки типов в Python - PullRequest
39 голосов
/ 17 мая 2011

Я работаю с большой существующей кодовой базой Python и хотел бы начать добавлять аннотации типов, чтобы получить некоторый уровень статической проверки. Я представляю что-то вроде Erlang , Strongtalk или Typed Scheme / Racket .

Я видел быстрые и грязные декораторы, которые вставляют динамические проверки на основе параметров функции и аннотаций возвращаемого типа, но я ищу что-то более надежное и выполняющее проверки во время компиляции.

Какие инструменты доступны прямо сейчас для такого рода вещей? Я знаком с компиляторами и проверкой типов и определенно готов улучшить неполный инструмент, если он имеет хорошую основу.

(Примечание: меня не интересует обсуждение плюсов и минусов статической типизации.)

РЕДАКТИРОВАТЬ : Пример:

def put(d, k, v):
   d[k] = v

Я бы хотел иметь возможность комментировать функцию put как имеющую тип put<K,V>(dict<K,V>, K, V) -> None.

ОБНОВЛЕНИЕ : Новый PEP 484 (сентябрь 2014 г.) определяет стандарт для статической типизации и аннотаций типов в Python 3.5+. Существует инструмент проверки типа, называемый mypy , который совместим с PEP 484.

Ответы [ 7 ]

16 голосов
/ 17 мая 2011

Изменить 2016-11-11: Просто используйте mypy .Тип подсказки можно добавлять постепенно.В исходном коде Python 3 он проверяет стандартные подсказки типа PEP 484 .Типы все еще могут быть выражены в Python 2 с помощью специальных комментариев. Гвидо это нравится .

Этот пост изначально был написан давным-давно, до того, как была написана mypy.Я сохранил оригинальное содержание сообщения ниже, даже если оно не совсем точное.


Исходное сообщение:

Возможно, вы захотите проверить некоторыеиз проектов, упомянутых в этом связанном посте StackOverflow по статическому анализу для Python .

В итоге:

Поскольку Python широко использует типизацию утки , то, что можно назвать "ошибки типа "в других языках могут в конечном итоге быть" объект X не поддерживает метод Y"в Python.

Редактировать 2011-05-17:

Я согласен с delnan, что статическая типизация невозможна для Python [очевидно, неправильно] .Но поскольку наш скептицизм, похоже, не удерживает вас, я могу лишь дать вам больше информации по этому вопросу.Я представляю:

  • Обсуждение вывода типа для Python .(Другие ссылки здесь.)
  • Статьи Гвидо ван ван Россума о добавлении дополнительной статической типизации: part 1 и part 2 .
  • RPython , подмножество Python, у которого может быть шанс на статический анализ, достаточный для некоторой проверки типов.
9 голосов
/ 08 сентября 2014

Вы можете найти mypy интересным. Это было предложено для включения в Python 3.5 Гвидо .

6 голосов
/ 01 июля 2013

Проверьте это сообщение: PySonar: статический анализатор для Python . PySonar - это инструмент, который выводит типы, используя абстрактную интерпретацию (частичное выполнение) кода. Он находит все возможные пути выполнения вашей программы и находит все возможные типы всех переменных.

Существует в основном три версии PySonar:

  • Java с открытым исходным кодом (индексатор Jython)
  • Java с закрытым исходным кодом (скрыто в Google)
  • Питон с открытым исходным кодом ( мини-пизонар )

Ни один из них (кроме закрытого исходного кода) полностью не реализован. Но основная идея заключается в том, что вы можете использовать его в качестве основы для своей работы.

3 голосов
/ 15 июня 2011

Не знаю, поможет ли это, но ради чего это стоит, Джереми Сик из Университета Колорадо проделал некоторую работу по постепенной печати, и я обнаружил, что это делает быстрый поиск. http://www.wiki.jvmlangsummit.com/pdf/28_Siek_gradual.pdf

Полагаю (я могу ошибаться), что сейчас нет перспективных инструментов с открытым исходным кодом, поскольку его исследования выглядят относительно новыми.

Лучше всего связаться с авторами и спросить, могут ли они предоставить вам свой код.

2 голосов
/ 26 августа 2014

Мне нравится старатель , серверная часть landscape.io . Он объединяет вывод существующих анализаторов, таких как pylint, pyflakes, pep8, frosted ..., в один отчет. Ухоженная.

2 голосов
/ 13 ноября 2013

Существует «постепенный» пакет для Python 3;см. PIP или Репозиторий Bitbucket

По-видимому, это реализация группы из Джереми Сика , которая, кажется, является авторитетнойполе постепенной типизации.

Некоторые аннотации, по-видимому, необходимы, вот пример:

from gradual import *

@typed
def calculate_total(a:int, b:int) -> int:
    return a + b//100

Что касается аннотаций, это не так уж плохо.Я не использовал пакет, поэтому не могу говорить о его качестве, но синтаксис (и люди, стоящие за ним), безусловно, делают его многообещающим.

1 голос
/ 29 октября 2015

У меня была похожая потребность некоторое время назад. У всех существующих решений, которые я нашел, были какие-то проблемы, или у них нет функции, которую я хотел бы иметь, поэтому я сделал свое собственное.

Вот как вы его используете:

from requiretype import require

@require(name=str, age=(int, float, long))
def greet_person(name, age):
    print "Hello {0} ({1})".format(name, age)

>>> greet_person("John", 42)
Hello John (42)

>>> greet_person("John", "Doe")
# [...traceback...]
TypeError: Doe is not a valid type.
Valid types: <type 'int'>, <type 'float'>, <type 'long'>

>>> greet_person(42, 43)
# [...traceback...]
TypeError: 42 is not a <type 'str'> type

Надеюсь, это полезно для вас.

Для более подробной информации смотрите:

P.S .: (цитируя себя из репозитория github)

В большинстве случаев я бы рекомендовал использовать тесты вместо проверки типов, поскольку это более естественно сделать в Python. Но есть некоторые случаи, когда вы хотите / должны указать конкретный тип для использования, и так как в python нет проверки типов для параметров, вот где это полезно.

...