HOWTO · Python

Ottieni il nome della funzione in Python

Dimostra come generare un nome di funzione in Python

In questa pagina

Per ottenere il nome di una funzione, leggi il suo attributo __name__ senza chiamarla: function.__name__ restituisce una stringa. Usa __qualname__ quando è importante il contesto lessicale e ispeziona un frame solo se ti servono informazioni sulla funzione attualmente in esecuzione.

Ottenere il nome di una funzione con __name__

Un oggetto funzione espone il proprio nome breve tramite __name__. Questo esempio definisce due funzioni e ne stampa i nomi; non chiama nessuna delle due.

def greet():
    return "Hello"


def farewell():
    return "Goodbye"


print(greet.__name__)
print(farewell.__name__)
greet
farewell

L’attributo funziona anche con le funzioni integrate e quelle importate. Per esempio, print.__name__ è print, mentre os.system.__name__ è system:

import os

print(print.__name__)
print(os.system.__name__)
print
system

Queste espressioni esaminano gli oggetti funzione: non chiamano nessuna delle due funzioni. Questa distinzione è utile quando passi una funzione a un’altra parte del programma o ne mostri l’identità.

Ottenere un nome qualificato con __qualname__

__qualname__ include il percorso lessicale della funzione all’interno dell’ambito che la contiene. Può distinguere metodi o funzioni annidate che hanno lo stesso nome breve in __name__.

class Report:
    def render(self):
        return "ready"


print(Report.render.__name__)
print(Report.render.__qualname__)
render
Report.render

Per questo metodo, il nome breve è render e quello qualificato è Report.render. Nessuno dei due attributi è un identificatore univoco: due funzioni in moduli diversi possono avere lo stesso nome qualificato, e assegnare una funzione a un’altra variabile non ne cambia il nome dichiarato.

Usa __name__ per una visualizzazione concisa o per una ricerca basata sul nome dichiarato della funzione. Usa __qualname__ quando la classe contenitrice o l’ambito annidato aiutano a specificare a quale funzione ti riferisci. Entrambi sono attributi dell’oggetto funzione, quindi si fa riferimento alla funzione senza parentesi.

Esaminare il frame della chiamata corrente

Quando il codice ha bisogno specificamente del nome della funzione attualmente in esecuzione, il modulo inspect di Python può esporre il frame corrente e co_name del relativo oggetto codice. È una tecnica di introspezione utile per il debug e strumenti correlati, ma non è il modo abituale per recuperare il nome di un oggetto funzione.

import inspect


def current_function_name():
    frame = inspect.currentframe()
    if frame is None:
        return None
    return frame.f_code.co_name


print(current_function_name())
current_function_name

inspect.currentframe() può restituire None nelle implementazioni che non supportano il recupero dei frame. Gli oggetti frame possono anche mantenere riferimenti alle variabili locali, quindi rilascia i riferimenti ai frame se li conservi oltre una breve ispezione. sys._getframe(0).f_code.co_name è un’alternativa di livello più basso, disponibile in alcune implementazioni; poiché il nome inizia con un trattino basso, considerala un’interfaccia specifica dell’implementazione, non un’API portabile per ottenere i nomi.

Scegliere l’approccio giusto

  • Usa function.__name__ per ottenere il nome breve di un oggetto funzione noto.
  • Usa function.__qualname__ quando vuoi includere nel nome visualizzato il contesto di una classe o di un ambito annidato.
  • Usa inspect.currentframe() o sys._getframe() solo se ti servono dettagli sul frame attualmente in esecuzione, per esempio durante il debug.

Per mostrare normalmente il nome di una funzione, __name__ è la risposta diretta. Gli esempi sopra sono stati eseguiti correttamente e i risultati visualizzati mostrano i nomi restituiti da ciascuna espressione.