HOWTO · Python

Obtenir le nom de la fonction en Python

Il démontre comment produire un nom de fonction en Python

Sur cette page

Pour obtenir le nom d’une fonction, lisez son attribut __name__ sans appeler la fonction : function.__name__ renvoie une chaîne de caractères. Utilisez __qualname__ lorsque le contexte lexical compte, et inspectez une frame uniquement si vous avez besoin d’informations sur la fonction en cours d’exécution.

Obtenir le nom d’une fonction avec __name__

Un objet fonction expose son nom court dans __name__. Cet exemple définit deux fonctions et affiche leurs noms sans appeler l’une ou l’autre.

def greet():
    return "Hello"


def farewell():
    return "Goodbye"


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

Cet attribut fonctionne également avec les fonctions intégrées et importées. Par exemple, print.__name__ vaut print, tandis que os.system.__name__ vaut system :

import os

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

Ces expressions consultent les objets fonction ; elles n’appellent ni l’une ni l’autre des fonctions. Cette distinction est utile lorsque vous transmettez une fonction à une autre partie d’un programme ou que vous affichez son nom.

Obtenir un nom qualifié avec __qualname__

__qualname__ inclut le chemin lexical de la fonction dans la portée qui la contient. Cela permet de distinguer des méthodes ou des fonctions imbriquées qui partagent le même __name__ court.

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


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

Pour cette méthode, le nom court est render et le nom qualifié est Report.render. Aucun de ces attributs n’est un identifiant unique : deux fonctions de modules différents peuvent avoir le même nom qualifié, et affecter une fonction à une autre variable ne modifie pas le nom qui lui a été déclaré.

Utilisez __name__ pour afficher ou rechercher simplement une fonction à partir de son nom déclaré. Utilisez __qualname__ lorsque la classe englobante ou la portée imbriquée aide à préciser de quelle fonction il s’agit. Ce sont deux attributs de l’objet fonction : on référence donc la fonction sans parenthèses.

Inspecter la frame d’appel actuelle

Lorsque le code a précisément besoin du nom de la fonction en cours d’exécution, le module Python inspect peut exposer la frame actuelle et le co_name de son objet code. Cette technique d’introspection sert au débogage et aux outils associés ; ce n’est pas la méthode habituelle pour obtenir le nom d’un objet fonction.

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() peut renvoyer None sur les implémentations qui ne prennent pas en charge la récupération des frames. Les objets frame peuvent aussi conserver des références aux variables locales : libérez donc ces références si vous les gardez au-delà d’une brève inspection. sys._getframe(0).f_code.co_name constitue une solution de plus bas niveau lorsqu’elle est disponible. Comme son nom commence par un trait de soulignement, considérez-la comme une interface propre à l’implémentation, et non comme une API portable pour obtenir un nom.

Choisir la bonne méthode

  • Utilisez function.__name__ pour obtenir le nom court d’un objet fonction connu.
  • Utilisez function.__qualname__ lorsque la portée imbriquée ou le contexte de classe doit figurer dans le nom affiché.
  • Utilisez inspect.currentframe() ou sys._getframe() uniquement si vous avez besoin de détails sur la frame en cours d’exécution, par exemple pour le débogage.

Pour afficher le nom d’une fonction dans un cas courant, __name__ est la réponse directe. Les exemples ci-dessus ont été exécutés avec succès ; leurs sorties affichent les noms renvoyés par chaque expression.