2014-09-15 10 views
8

Jeśli ktoś robi dir() na niektórych wbudowanych callables (konstruktory klasy, metody, etc) na CPython 3.4, jeden dowiaduje się, że wielu z nich często mają specjalny atrybut o nazwie __text_signature__, na przykład :Co __signature__ i __text_signature__ wykorzystywane w Pythonie 3.4

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

Jednak dokumentacja do tego nie istnieje. Co więcej, szukanie w Google nazwy atrybutu sugeruje, że istnieje również inny możliwy specjalny atrybut __signature__, chociaż nie znalazłem żadnych wbudowanych funkcji, które by go zawierały.

Wiem, że są one powiązane z podpisem funkcji, ale nic poza tym, co oznaczają ich wartości i jaki jest ich użytek?

Odpowiedz

8

Atrybuty te umożliwiają introspekcję obiektów Pythona zdefiniowanych w kodzie C. C-API Argument Clinic dostarcza dane, aby pomóc modułowi inspect podczas budowania Signature objects. Introspekcja funkcji C-API nie była wcześniej obsługiwana.

Zobacz wewnętrzny numer inspect._signature_fromstr() function dotyczący użycia wartości __text_signature__.

Obecnie atrybut __text_signature__ jest wypełniany z wewnętrznego zestawu instrukcji docstring dla obiektów w C-API; proste wyszukiwanie tekstu jest wykonywane dla objectname(...)\n--\n\n, gdzie \n--\n\n jest typowe dla łańcuchów dokumentacji generowanych przez Attribute Clinic. Spójrz na type object slots, jeśli chcesz znaleźć przykłady. Lub możesz spojrzeć na audioop module source, aby zobaczyć, w jaki sposób klinika Argument jest używany do definiowania sygnatur; Argument Clinic script jest uruchamiany na tych podczas budowania w celu wygenerowania docstrukcji (w towarzyszącym audioop.c.h file).

Atrybut __signature__, jeśli występuje, byłby obiektem inspect.Signature(); zamiast dostarczania wersji tekstowej C-API może zamiast tego dostarczyć w pełni przeanalizowaną instancję Signature.

+0

W twojej odpowiedzi jest poważny błąd, C-API nazywa się Argument Clinic, odniesienie do szkicu Monty Pythona o tej samej nazwie;) –

+0

@Antti: * Powiedziałem ci raz *. –

+0

Początek nadal mówi "Attribute Clinic": D –