2014-09-15 7 views
8

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

>>> print(object.__text_signature__) 
() 
>>> print(int.__text_signature__) 
None 

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

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

ответ

8

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

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

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

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

+0

В вашем ответе есть серьезная ошибка, но C-API называется Argument Clinic, ссылка на эскиз Monty Python под тем же именем;) –

+0

@ Antti: * Я уже говорил вам один раз *. –

+0

Начало по-прежнему говорит «Атрибутика клиники»: D –