2012-02-03 21 views
5

Devo personalizzare __getattr__ per chiamare un'altra funzione da leggere.doc per __getattr__ attributi definiti

Questo funziona bene tranne che l'aiuto (oggetto.attr) non funziona. Questo codice è utilizzato in un ambiente interattivo, quindi l'help() diventa importante per noi.

Esiste un design migliore per ottenere le stesse funzionalità ma con help() che funziona bene.

risposta

1

Il testo utilizzato per "help" è effettivamente l'attributo "__doc__" di un oggetto. La questione è che, a seconda dell'oggetto che hai, non puoi semplicemente impostare l'attributo __doc__ su di esso.

Se quello che vi serve è "help(object.attr)" al lavoro (e non che help(object) vi mostra tutti i possibili attributi) è un po 'più facile - si dovrebbe ottenere solo shure che qualunque __getattr__ rendimenti non hae un docstring impostato correttamente.

dal momento che "non sta funzionando" Direi che si sta restituendo i risultati interne di alcuni chiamata di funzione, come in questo frammento:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an integer 
     return foo() 
    ... 

Se semplicemente vuoi restituire la funzione "foo" in sé, senza chiamarlo, itś docstring verrebbe visualizzato normalmente.

Cosa si può fare è quello di avvolgere il valore di ritorno in __getattr__ come oggetto di un wich classe creata dinamicamente contiene una docstring corretta - così, provare a utilizzare somethong come questo:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an (whatever object) 
     result = foo() 
     res_type = type(result) 
     wrapper_dict = res_type.__dict__.copy() 
     wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>") 
     new_type = type(res_type.__name__, (res_type,), wrapper_dict) 
     # I will leave it as an "exercise for the reader" if the 
     # constructor of the returned object can't take an object 
     # of the same instance (python native data types, like int, float, list, can) 
     new_result = new_type(result) 
    elif ...: 
     ... 
    return new_result 

Questo dovrebbe funzionare - a meno che Ho sbagliato il motivo per cui hel non funziona in primo luogo - se questo è il caso, si prega di dare qualche esempio di ciò che si sta restituendo da __getattr__.

+0

Thannks, funziona nel mio caso. Tutti attr in __getattr__ restituisce tipi di dati nativi di python. –

1

È possibile trasformare l'attributo in una proprietà. La proprietà utilizzerà automaticamente la docstring del metodo getter come propria. In alternativa, è possibile fornire l'argomento doc a property().

+0

All'interno __getattr__ è una chiamata di funzione che utilizza attr come parametro. È possibile con property()? Questo attr è dinamico, non noto alla creazione dell'oggetto. –