Чтобы задать свой очень конкретный вопрос, мне нужно довольно длинное введение, чтобы мотивировать и объяснить его - обещаю, что в конце уместен правильный вопрос!
При чтении части большой кодовой базы Python иногда встречается код, в котором интерфейс, требуемый для аргумента, не очевиден из "соседнего" кода в том же модуле или пакете. Как пример:
def make_factory(schema):
entity = schema.get_entity()
...
Может быть много "схем" и "фабрик", с которыми работает код, и "def get_entity ()" также может быть довольно распространенным (или, возможно, функция не вызывает каких-либо методов для схема, но просто передает его в другую функцию). Так что быстрый grep не всегда помогает узнать больше о том, что такое «схема» (и то же самое относится и к типу возвращаемого значения). Хотя «типизирование утки» является хорошей особенностью Python, иногда неуверенность в уме читателя относительно интерфейса аргументов, передаваемых как «схема», мешает быстрому пониманию кода (и то же самое относится к неопределенности относительно типичного конкретного классы, которые реализуют интерфейс). Просмотр автоматизированных тестов может помочь, но явная документация может быть лучше, потому что она быстрее читается. Любая такая документация является наилучшей, если она сама может быть проверена, чтобы не устареть.
Док-тесты - один из возможных подходов к решению этой проблемы, но вопрос не в этом.
Python 3 имеет функцию «аннотации параметров» (часть функции аннотаций функций, определенной в PEP 3107). Сферы применения этой функции не определяются языком, но могут использоваться для этой цели. Это может выглядеть так:
def make_factory(schema: "xml_schema"):
...
Здесь «xml_schema» идентифицирует интерфейс Python, который должен поддерживать аргумент, передаваемый этой функции. В другом месте был бы код, который определяет этот интерфейс в терминах атрибутов, методов и сигнатур их аргументов и т. Д., И код, который позволяет самоанализу проверять, предоставляют ли конкретные объекты интерфейс (возможно, реализованный с использованием чего-то вроде zope.interface / zope.schema). Обратите внимание, что это не обязательно означает, что интерфейс проверяется каждый раз, когда передается аргумент, и что статический анализ не выполняется. Скорее, мотивация определения интерфейса состоит в том, чтобы предоставить способы написания автоматических тестов, которые проверяют, что эта документация не устарела (это могут быть довольно общие тесты, так что вам не нужно писать новый тест для каждой функции, которая использует параметры, или вы можете включить проверку интерфейса во время выполнения, но только при запуске модульных тестов). Вы можете пойти дальше и аннотировать интерфейс возвращаемого значения, которое я не буду иллюстрировать.
Итак, вопрос:
Я хочу сделать именно это, но использую Python 2 вместо Python 3. Python 2 не имеет функции аннотаций функций. Какая «самая близкая вещь» в Python 2? Очевидно, что есть несколько способов сделать это, но я подозреваю, что есть один (относительно) очевидный способ сделать это.
Для дополнительных точек: назовите библиотеку, которая реализует один очевидный способ.