2014-09-15 18 views
8

Se uno fa dir() su alcuni callabili predefiniti (costruttori di classe, metodi, ecc.) Su CPython 3.4, si scopre che molti di essi hanno spesso un attributo speciale chiamato __text_signature__, ad esempio :Che cosa sono utilizzati __signature__ e __text_signature__ in Python 3.4

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

Tuttavia la documentazione per questo è inesistente. Inoltre, il googling per il nome dell'attributo suggerisce che esiste anche un altro attributo speciale possibile __signature__, sebbene non abbia trovato alcuna funzione incorporata che possa averlo.

So che sono correlati alla firma dell'argomento della funzione, ma nulla oltre a ciò, cosa significano i loro valori e a che cosa servono?

risposta

8

Questi attributi servono per abilitare l'introspezione per oggetti Python definiti nel codice C. Il C-API Argument Clinic fornisce i dati per assistere il modulo inspect durante la creazione di Signature objects. L'introspezione delle funzioni API C non era supportata prima.

Vedere interno inspect._signature_fromstr() function su come viene utilizzato il valore __text_signature__.

Attualmente, l'attributo __text_signature__ viene riempito dal set di docstring interno sugli oggetti nella C-API; viene eseguita una semplice ricerca di testo per objectname(...)\n--\n\n, dove lo standard \n--\n\n è tipico delle stringhe di documentazione generate da Attribute Clinic. Dai uno sguardo allo type object slots se vuoi trovare qualche esempio. Oppure puoi guardare lo audioop module source per vedere come viene utilizzata la Clinica degli Argomenti per definire le firme; il Argument Clinic script viene eseguito su quelli in fase di generazione per generare le docstring (nel documento di accompagnamento audioop.c.h file).

L'attributo __signature__, se presente, sarebbe un oggetto inspect.Signature(); invece di fornire una versione testuale, una C-API può fornire un'istanza Signature completamente analizzata.

+0

C'è comunque un grave errore nella risposta, la C-API è chiamata Argument Clinic, un riferimento allo schizzo Monty Python con lo stesso nome;) –

+0

@Antti: * Te l'ho detto una volta *. –

+0

L'inizio dice ancora "Attribute Clinic": D –

Problemi correlati