Что такое __signature__ и __text_signature__, используемые в Python 3.4

Если кто-то выполняет dir() для некоторых встроенных вызываемых элементов (конструкторов классов, методов и т.д.) В CPython 3.4, он обнаруживает, что многие из них часто имеют специальный атрибут с именем __text_signature__, например:

>>> object.__text_signature__
'()'
>>> int.__text_signature__
>>> # was None

Однако документации для этого не существует. Кроме того, поиск по имени атрибута предполагает, что существует также другой возможный специальный атрибут __signature__, хотя я не нашел встроенных функций, которые бы его имели.

Я знаю, что они связаны с сигнатурой аргумента функции, но ничего кроме этого, что означают их значения и для чего они нужны?

Ответ 1

Эти атрибуты предназначены для интроспекции объектов Python, определенных в коде C. C-API Argument Clinic предоставляет данные, чтобы помочь модулю inspect при построении Signature. Ранее не была проверена функция C-API.

См. внутреннюю функцию inspect._signature_fromstr() о том, как используется значение __text_signature__.

В настоящее время атрибут __text_signature__ заполняется из внутренней docstring, заданной для объектов в C-API; простой текстовый поиск выполняется для objectname(...)\n--\n\n, где \n--\n\n является типичным для строк документации, созданных с помощью атрибутов. Взгляните на type слоты для объектов, если вы хотите найти несколько примеров. Или вы можете посмотреть на источник audioop, чтобы узнать, как используется Аргументская клиника для определения подписей; Argument Clinic script запускается для тех, кто строит для создания докстрон (в сопроводительном audioop.c.h file).

Атрибут __signature__, если он присутствует, будет объектом inspect.Signature(); вместо предоставления текстовой версии C-API может предоставить полностью проанализированный экземпляр Signature вместо этого.