per una versione hardcoded che funziona decentemente con decoratori "ben educati". Deve essere dichiarato dopo la funzione. se la funzione viene rimbalzata in un secondo momento, le modifiche vengono aggiornate qui.
def get_name_doc():
# global function # this is optional but makes your intent a bit more clear.
return function.__name__, function.__doc__
Questo è un trucco piuttosto brutto, in quanto abusa del modo in cui gli argomenti di default funzionano. Utilizzerà qualsiasi funzione associata al momento in cui questa funzione è 'inizializzata' e la ricorderà anche se la funzione viene rimbalzata. Chiamarlo con args porterà a risultati interessanti.
def get_name_doc(fn=function):
return fn.__name__, fn.__doc__
e uno dinamico che è ancora codificato, ma si aggiorna sulla funzione ricevendo una chiamata con un argomento di True. Fondamentalmente questa versione verrà aggiornata solo quando gli verrà richiesto di farlo.
def get_name_doc(update=False):
global fn
if update:
fn = function
return fn.__name__, fn.__doc__
Ora ovviamente ci sono anche esempi di decoratori.
@decorator # applying the decorator decorator to make it well behaved
def print_name_doc(fn, *args, **kwargs):
def inner(*args, **kwargs):
print(fn.__doc__, fn.__name__) # im assuming you just want to print in this case
return fn(*args, **kwargs)
return inner
si dovrebbe leggere sul decoratore decoratore (almeno). Cerca l'origine NamedTuple (dal modulo delle collezioni) poiché implica l'essere codificato. Purtroppo il codice tupla è piuttosto strano. È un formato di stringa utilizzato con eval piuttosto che con codice tradizionale, ma funziona davvero bene. Questa sembra essere la variante più promettente. Potresti riuscire a farlo anche con metaclasess, che porta a un codice accurato, ma a cose piuttosto brutte nascoste dietro le quinte, che devi codificare. Questo id sconsiglia di
Im sospetto che ci sia probabilmente un modo più semplice di andare in ispezione/riflessione/modelli/metaclasess semplicemente aggiungendo la seguente riga alla fine del modulo.
help(<module>)
dove si trova il nome del modulo su cui si sta lavorando (una stringa). O anche la variabile __name__. Questo potrebbe essere fatto anche nel file __init__.py se si lavora con più moduli o su singole classi penso che sia.
In questo caso, c'è un modo per ottenere la stringa doc 'correct'? Qualche soluzione per risolvere il problema? – George
@George, vedi il fondo del mio post per avere un'idea. Ho giocato con cose del genere semplicemente hackerando ma non sono mai riuscito a farlo funzionare a un livello che considero pronto per la produzione. – aaronasterling
Informazioni su 'inspect.stack()' su questo link: http://stackoverflow.com/questions/900392/getting-the-caller-function-name-inside-another-function-in-python, come fa a sapere quale indice accedere allo stack? Suppongo che non sia una supposizione, giusto? Sono interessato se riesci a capire in modo dinamico quale 'stack [x] [y]' accedere? – George