Comment vérifier si une fonction existe en Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), nous allons explorer comment vérifier si une fonction existe en Python. Comprendre l'existence d'une fonction est crucial pour écrire un code robuste et flexible.

Nous commencerons par définir ce que signifie l'existence d'une fonction en Python, puis nous utiliserons hasattr() sur un module et callable() sur des objets pour vérifier l'existence d'une fonction. Le laboratoire inclut la création d'un script Python pour démontrer la vérification de la présence d'une fonction à l'aide de l'opérateur in et du dictionnaire globals().


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/scope("Scope") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") subgraph Lab Skills python/function_definition -.-> lab-559517{{"Comment vérifier si une fonction existe en Python"}} python/scope -.-> lab-559517{{"Comment vérifier si une fonction existe en Python"}} python/build_in_functions -.-> lab-559517{{"Comment vérifier si une fonction existe en Python"}} python/classes_objects -.-> lab-559517{{"Comment vérifier si une fonction existe en Python"}} end

Définir ce que signifie l'existence d'une fonction

Dans cette étape, nous allons explorer ce que signifie l'existence d'une fonction en Python et comment vérifier sa présence. Comprendre cela est crucial pour écrire un code robuste et flexible capable de gérer différentes situations de manière élégante.

En Python, une fonction existe si elle est définie et accessible dans la portée (scope) actuelle. Cela signifie que la fonction a été créée à l'aide du mot-clé def et peut être appelée par son nom. Cependant, parfois, vous pourriez vouloir vérifier si une fonction existe avant de l'appeler, notamment lorsque vous utilisez des bibliothèques externes ou des modules définis par l'utilisateur.

Commençons par créer un simple script Python pour illustrer cela.

  1. Ouvrez l'éditeur VS Code dans l'environnement LabEx.

  2. Créez un nouveau fichier nommé function_existence.py dans le répertoire ~/project.

    touch ~/project/function_existence.py
  3. Ouvrez le fichier function_existence.py dans l'éditeur et ajoutez le code suivant :

    def greet(name):
        return "Hello, " + name + "!"
    
    ## Vérifie si la fonction 'greet' existe
    if 'greet' in globals():
        print("The function 'greet' exists.")
        result = greet("LabEx User")
        print(result)
    else:
        print("The function 'greet' does not exist.")

    Dans ce code, nous définissons une fonction appelée greet qui prend un nom en entrée et renvoie un message de salutation. Nous utilisons ensuite l'opérateur in pour vérifier si la chaîne de caractères 'greet' est présente dans le dictionnaire globals(). La fonction globals() renvoie un dictionnaire représentant la table des symboles globaux actuelle, qui inclut toutes les fonctions et variables définies globalement.

  4. Exécutez le script en utilisant la commande suivante dans le terminal :

    python ~/project/function_existence.py

    Vous devriez voir la sortie suivante :

    The function 'greet' exists.
    Hello, LabEx User!

    Cela confirme que la fonction greet existe et est appelée correctement.

  5. Maintenant, modifions le script pour vérifier l'existence d'une fonction qui n'existe pas. Changez la condition if pour vérifier l'existence d'une fonction nommée goodbye :

    def greet(name):
        return "Hello, " + name + "!"
    
    ## Vérifie si la fonction 'goodbye' existe
    if 'goodbye' in globals():
        print("The function 'goodbye' exists.")
        result = goodbye("LabEx User")
        print(result)
    else:
        print("The function 'goodbye' does not exist.")
  6. Exécutez le script à nouveau :

    python ~/project/function_existence.py

    Vous devriez maintenant voir la sortie suivante :

    The function 'goodbye' does not exist.

    Cela démontre comment vous pouvez utiliser l'opérateur in et la fonction globals() pour vérifier l'existence d'une fonction avant de tenter de l'appeler. Cela peut aider à prévenir les erreurs et rendre votre code plus robuste.

Utiliser hasattr() sur un module

Dans cette étape, nous allons apprendre à utiliser la fonction hasattr() en Python pour vérifier si un module ou un objet possède un attribut spécifique, comme une fonction ou une variable. Cela est particulièrement utile lorsque vous travaillez avec des bibliothèques externes ou des modules où vous n'êtes pas sûr qu'une fonction particulière soit disponible.

La fonction hasattr() prend deux arguments : l'objet ou le module que vous souhaitez inspecter, et le nom de l'attribut que vous voulez vérifier. Elle renvoie True si l'attribut existe et False sinon.

Créons un script Python pour démontrer comment utiliser hasattr() avec un module.

  1. Ouvrez l'éditeur VS Code dans l'environnement LabEx.

  2. Créez un nouveau fichier nommé hasattr_example.py dans le répertoire ~/project.

    touch ~/project/hasattr_example.py
  3. Ouvrez le fichier hasattr_example.py dans l'éditeur et ajoutez le code suivant :

    import math
    
    ## Vérifie si la fonction 'sqrt' existe dans le module 'math'
    if hasattr(math, 'sqrt'):
        print("The 'sqrt' function exists in the 'math' module.")
        result = math.sqrt(25)
        print("The square root of 25 is:", result)
    else:
        print("The 'sqrt' function does not exist in the 'math' module.")
    
    ## Vérifie si la constante 'pi' existe dans le module 'math'
    if hasattr(math, 'pi'):
        print("The 'pi' constant exists in the 'math' module.")
        print("The value of pi is:", math.pi)
    else:
        print("The 'pi' constant does not exist in the 'math' module.")
    
    ## Vérifie pour un attribut non existant
    if hasattr(math, 'non_existent_attribute'):
        print("The 'non_existent_attribute' exists in the 'math' module.")
    else:
        print("The 'non_existent_attribute' does not exist in the 'math' module.")

    Dans ce code, nous importons d'abord le module math. Ensuite, nous utilisons hasattr() pour vérifier si la fonction sqrt et la constante pi existent dans le module math. Nous vérifions également pour un attribut non existant pour voir comment hasattr() gère ce cas.

  4. Exécutez le script en utilisant la commande suivante dans le terminal :

    python ~/project/hasattr_example.py

    Vous devriez voir la sortie suivante :

    The 'sqrt' function exists in the 'math' module.
    The square root of 25 is: 5.0
    The 'pi' constant exists in the 'math' module.
    The value of pi is: 3.141592653589793
    The 'non_existent_attribute' does not exist in the 'math' module.

    Cette sortie démontre comment hasattr() peut être utilisé pour vérifier l'existence de fonctions et de constantes dans un module.

  5. Maintenant, essayons d'utiliser hasattr() avec un objet personnalisé. Modifiez le script comme suit :

    class MyClass:
        def __init__(self):
            self.attribute1 = "Hello"
    
        def my_method(self):
            return "World"
    
    obj = MyClass()
    
    ## Vérifie si l'objet a l'attribut 'attribute1'
    if hasattr(obj, 'attribute1'):
        print("The object has the attribute 'attribute1'.")
        print("The value of attribute1 is:", obj.attribute1)
    else:
        print("The object does not have the attribute 'attribute1'.")
    
    ## Vérifie si l'objet a la méthode 'my_method'
    if hasattr(obj, 'my_method'):
        print("The object has the method 'my_method'.")
        print("The result of my_method is:", obj.my_method())
    else:
        print("The object does not have the method 'my_method'.")
    
    ## Vérifie pour un attribut non existant
    if hasattr(obj, 'non_existent_attribute'):
        print("The object has the attribute 'non_existent_attribute'.")
    else:
        print("The object does not have the attribute 'non_existent_attribute'.")
  6. Exécutez le script à nouveau :

    python ~/project/hasattr_example.py

    Vous devriez voir la sortie suivante :

    The object has the attribute 'attribute1'.
    The value of attribute1 is: Hello
    The object has the method 'my_method'.
    The result of my_method is: World
    The object does not have the attribute 'non_existent_attribute'.

    Cela montre comment hasattr() peut également être utilisé pour vérifier l'existence d'attributs et de méthodes dans des objets personnalisés.

Vérifier avec callable() sur des objets

Dans cette étape, nous allons explorer comment utiliser la fonction callable() en Python pour déterminer si un objet est appelable, c'est-à-dire s'il peut être appelé comme une fonction. Cela est utile pour distinguer entre les fonctions, les méthodes et les autres types d'objets.

La fonction callable() prend un argument : l'objet que vous souhaitez vérifier. Elle renvoie True si l'objet est appelable et False sinon.

Créons un script Python pour démontrer comment utiliser callable() avec différents types d'objets.

  1. Ouvrez l'éditeur VS Code dans l'environnement LabEx.

  2. Créez un nouveau fichier nommé callable_example.py dans le répertoire ~/project.

    touch ~/project/callable_example.py
  3. Ouvrez le fichier callable_example.py dans l'éditeur et ajoutez le code suivant :

    def my_function():
        return "Hello from my_function!"
    
    class MyClass:
        def my_method(self):
            return "Hello from my_method!"
    
    obj = MyClass()
    variable = 42
    
    ## Vérifie si my_function est appelable
    if callable(my_function):
        print("my_function is callable.")
        print(my_function())
    else:
        print("my_function is not callable.")
    
    ## Vérifie si MyClass est appelable
    if callable(MyClass):
        print("MyClass is callable.")
        instance = MyClass()  ## Création d'une instance de la classe
    else:
        print("MyClass is not callable.")
    
    ## Vérifie si obj.my_method est appelable
    if callable(obj.my_method):
        print("obj.my_method is callable.")
        print(obj.my_method())
    else:
        print("obj.my_method is not callable.")
    
    ## Vérifie si obj est appelable
    if callable(obj):
        print("obj is callable.")
    else:
        print("obj is not callable.")
    
    ## Vérifie si variable est appelable
    if callable(variable):
        print("variable is callable.")
    else:
        print("variable is not callable.")

    Dans ce code, nous définissons une fonction my_function, une classe MyClass avec une méthode my_method, une instance obj de MyClass et une variable variable. Nous utilisons ensuite callable() pour vérifier chacun de ces objets.

  4. Exécutez le script en utilisant la commande suivante dans le terminal :

    python ~/project/callable_example.py

    Vous devriez voir la sortie suivante :

    my_function is callable.
    Hello from my_function!
    MyClass is callable.
    obj.my_method is callable.
    Hello from my_method!
    obj is not callable.
    variable is not callable.

    Cette sortie démontre comment callable() peut être utilisé pour vérifier si une fonction, une classe ou une méthode est appelable. Elle montre également qu'une instance de classe et une simple variable ne sont pas appelables.

Résumé

Dans ce laboratoire (lab), nous avons exploré comment vérifier l'existence d'une fonction en Python. Nous avons appris qu'une fonction existe si elle est définie et accessible dans la portée (scope) actuelle.

Nous avons utilisé l'opérateur in avec le dictionnaire globals() pour déterminer si un nom de fonction est présent dans la table des symboles globales, ce qui indique son existence. Cela permet d'exécuter du code de manière conditionnelle en fonction de la disponibilité de fonctions spécifiques.