Чтобы задать мой очень конкретный вопрос, мне нужно довольно длинное вступление, чтобы мотивировать и объяснить его - я обещаю, что в конце будет правильный вопрос!
При чтении части Большая кодовая база Python, иногда можно встретить код, в котором интерфейс, требуемый для аргумента, не очевиден из «соседнего» кода в том же модуле или пакете. Например:
Код: Выделить всё
def make_factory(schema):
entity = schema.get_entity()
...
В коде может быть много «схем» и «фабрик», и «def get_entity()» также может быть довольно распространенным (или, возможно, функция не вызывает < em>любые методы схемы, а просто передает их другой функции). Таким образом, быстрый поиск grep не всегда помогает узнать больше о том, что такое «схема» (то же самое касается и возвращаемого типа). Хотя «утиная типизация» — хорошая особенность Python, иногда неопределённость в сознании читателя по поводу интерфейса аргументов, передаваемых в виде «схемы», мешает быстрому пониманию кода (то же самое касается неопределённости в отношении типичных конкретных классы, реализующие интерфейс). Просмотр автоматизированных тестов может помочь, но явная документация может быть лучше, поскольку ее быстрее читать. Любая подобная документация лучше всего, когда ее можно протестировать, чтобы она не устарела.
Доктесты — один из возможных подходов к решению этой проблемы, но вопрос заключается не в этом. about.
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? Очевидно, что существует несколько способов сделать это, но я подозреваю, что есть один (относительно) очевидный способ сделать это.
Для дополнительных моментов: назовите библиотеку, которая реализует один очевидный способ. .
Подробнее здесь:
https://stackoverflow.com/questions/581 ... n-python-2