import pdir


def use_dir():
    """
    Découvrir l'introspection via la fonction `dir()`

    Nécessite pdir2 pour montrer une sortie plus sympa aux étudiants.

    """
    # En python, tout est un objet, et a donc des attributs et des méthodes.
    # Le truc bien, c'est qu'en Python, on peut aussi manipuler et retrouver les
    # propriétés de ces attributs et méthodes.
    chaine = "Bonjour"
    # À la place de `pdir` on pouvait utiliser `dir` qui fait partie de python,
    # mais qui affiche la liste des attributs de l'objet de façon beaucoup moins
    # lisible.
    print(pdir(chaine))


def check_attrs():
    """
    Via l'introspection, accéder à des attributs d'objets programmatiquement.

    """
    chaine = "Bonjour"
    # Une chaîne a toujours une méthode `capitalize`, donc ça va fonctionner
    if hasattr(chaine, "capitalize"):
        print("L'objet a bien une fonction `capitalize`.")
        print(getattr(chaine, "capitalize"))
    # Mais une chaîne n'a pas d'attribut `doesnotexist`.
    if hasattr(chaine, "doesnotexist"):
        print("L'objet a un attribut `doesnotexist`.")
    else:
        print("L'objet n'a pas d'attribut `doesnotexist`.")


if __name__ == "__main__":
    print("Utilisation de la fonction `dir` :")
    use_dir()
    print("Utilisation de l'introspection d'attributs :")
    check_attrs()
