Принудительное использование типов параметров функции Python из строки документации

Генераторы документов epydoc и Sphinx позволяют кодировщику комментировать, какие типы должны быть у любого / всех параметров функции.

Мой вопрос: есть ли способ (или модуль), который обеспечивает эти типы (во время выполнения), когда задокументировано в строке документации. Это не было бы строгой типизацией (проверка во время компиляции), но (более вероятно) можно назвать фирменной типизацией (проверка во время выполнения). Может быть, поднятие "ValueError", или еще лучше... поднятие "SemanticError"

В идеале уже должно быть что-то (например, модуль), похожее наimport antigravity"модуль согласно xkcd, и этот модуль"firm_type_check"уже будет где-то удобным для загрузки.

К вашему сведению: строка документации для эпидока и сфинза выглядит следующим образом:

epydoc: параметры функций и методов:

  • @param p:... # Описание параметра p для функции или метода.
  • @type p:... # Ожидаемый тип для параметра p.
  • @return:... # Возвращаемое значение для функции или метода.
  • @rtype:... # Тип возвращаемого значения для функции или метода.
  • @keyword p:... # Описание параметра ключевого слова p.
  • @raise e:... # Описание обстоятельств, при которых функция или метод вызывает исключение e.

Sphinx: Внутри директив описания объектов Python списки полей reST с этими полями распознаются и хорошо форматируются:

  • параметр, параметр, аргумент, аргумент, ключ, ключевое слово: описание параметра.
  • тип: тип параметра.
  • Возникает, повышается, за исключением исключения: это (и когда) конкретное исключение возникает.
  • var, ivar, cvar: описание переменной.
  • return, return: описание возвращаемого значения.
  • rtype: тип возвращаемого значения.

Самым близким, что я смог найти, было упоминание Гвидо в mail.python.org, созданное Юккой Лехтосало из Mypy examples. CMIIW: mypy нельзя импортировать как модуль py3.

Подобные вопросы stackru, которые не используют строку документации как таковую:

1 ответ

Насколько мне известно, ничего подобного не существует по нескольким важным причинам:

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

  • Во-вторых, строки документов не гарантированно сохраняются. Если вы бежите python с -OO Например, все строки документации удаляются. Что тогда?

  • Наконец, в Python 3 введены необязательные аннотации функций, которые намного лучше подходят для этой цели: http://legacy.python.org/dev/peps/pep-3107/. В настоящее время Python ничего с ними не делает (это документация), но если бы я написал такой модуль, я бы использовал их, а не строки документации.

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

  • Clojure ( http://clojure.org/) невероятно динамичен и мощен (благодаря своей природе как Lisp) и поддерживает необязательную статическую типизацию через core.typed ( https://github.com/clojure/core.typed). Он ориентирован на параллелизм и сетевое взаимодействие (имеет STM и постоянные структуры данных <3), имеет большое сообщество и является одним из самых элегантно разработанных языков, которые я когда-либо видел. Тем не менее, он работает на JVM, что хорошо и плохо.

  • Голанг ( http://golang.org/) чувствует себя вроде Pythonic (или, по крайней мере, привлекает много беженцев из Python), статически типизирован и компилируется в нативный код.

  • Rust ( http://www.rust-lang.org/) более низкого уровня, чем тот, но у него одна из лучших систем типов, которые я когда-либо видел (вывод типов, сопоставление с образцом, черты, обобщенные типы, типы нулевого размера)....) и обеспечивает безопасность памяти и ресурсов во время компиляции. Он разрабатывается Mozilla как язык для написания следующего браузера (Servo), поэтому его основные цели - производительность и безопасность. Вы можете думать об этом как о современном взгляде на C++. Он компилируется в нативный код, но еще не достиг 1.0, и поэтому сам язык все еще может быть изменен. Вот почему я бы не рекомендовал писать в нем производственный код.

Другие вопросы по тегам