Python / dir() / Explorer les noms d’attributs d’un objet

dir(object) renvoie en Python une liste de noms d’attributs sous forme de chaînes. Elle ne renvoie ni n’exécute directement les méthodes ou valeurs. Les noms sont triés, mais l’objet peut personnaliser la liste : ce n’est pas un inventaire complet garanti de tout attribut accessible.

Le résultat contient des noms, pas des méthodes

Les attributs sont les données ou comportements associés à un objet ; les méthodes sont ses comportements appelables. Pour une chaîne, upper est un nom et text.upper() un appel réel. La référence officielle de dir() décrit son objectif d’exploration interactive pratique.

Les exemples complets nécessitent uniquement Python 3. Enregistrez le code en UTF-8 dans dir_example.py, puis lancez python dir_example.py, ou python3 selon l’environnement. Chaque exemple suivant peut remplacer le contenu du même fichier et fonctionner indépendamment.

text = "hello"
names = dir(text)
print(type(names).__name__)
print(all(isinstance(name, str) for name in names))
print("upper" in names)
print(names == sorted(names))
print(text.upper())

Résultat attendu :

list
True
True
True
HELLO

Tous les éléments sont des chaînes. Trouver upper ne convertit pas le texte : seule la dernière ligne appelle explicitement la méthode. Les listes complètes peuvent changer selon la version de Python ; l’exemple vérifie donc un nom pertinent plutôt qu’une liste figée.

Explorer aussi modules et listes

Un module contient des noms de fonctions, constantes et autres objets. Après avoir trouvé sqrt dans dir(math), utilisez math.sqrt(). De même, append ne modifie une liste que lors de son appel effectif.

import math

print("sqrt" in dir(math))
print(math.sqrt(9))
items = []
print("append" in dir(items))
items.append("a")
print(items)
True
3.0
True
['a']

Un nom ne précise pas les arguments ou le résultat. Consultez help(math.sqrt) ou la documentation officielle du module. Les traits de soulignement initiaux peuvent indiquer une convention ; ils ne constituent pas une protection empêchant l’accès extérieur.

dir() et vars() examinent des choses différentes

dir(instance) peut inclure les noms de la classe et de l’héritage, en plus des noms enregistrés directement. vars(object) renvoie plutôt son __dict__. C’est utile pour les attributs et valeurs directement stockés, mais tous les objets ne possèdent pas ce dictionnaire.

class User:
    role = "reader"

    def __init__(self, name):
        self.name = name

    def label(self):
        return f"{self.role}:{self.name}"

user = User("Ada")
print([name for name in dir(user) if name in ("name", "role", "label")])
print(vars(user))
print(user.label())
['label', 'name', 'role']
{'name': 'Ada'}
reader:Ada

name est stocké sur l’instance ; role et label viennent de la classe. Cela explique les résultats différents. Ici, vars(user) est le dictionnaire réel et non une copie : ne le modifiez pas par inadvertance pendant l’exploration. Sur un objet sans dictionnaire, par exemple certaines classes avec __slots__, vars() peut lever TypeError.

Sans argument, examiner l’espace de noms actuel

dir() renvoie les noms de l’espace local actuel, pas toutes les fonctions intégrées ou tous les paquets installés. Dans un nouveau script indépendant, le nom défini marker apparaît, tandis que la fonction intégrée abs n’est pas directement listée.

marker = 7
print("marker" in dir())
print("abs" in dir())
True
False

Une console interactive ou un notebook peut conserver des noms issus d’exécutions précédentes. Vérifiez donc le lieu de l’appel et les variables déjà présentes.

Comprendre __dir__() personnalisé et les attributs dynamiques

L’objet peut personnaliser la liste avec __dir__() et fournir des attributs dynamiquement avec __getattr__(). Un nom absent peut donc être accessible et un nom affiché peut échouer à la lecture.

class Dynamic:
    def __getattr__(self, name):
        if name == "answer":
            return 42
        raise AttributeError(name)

    def __dir__(self):
        return ["visible"]

item = Dynamic()
print(dir(item))
print("answer" in dir(item))
print(getattr(item, "answer"))
print(hasattr(item, "visible"))
['visible']
False
42
False

Cet objet liste seulement visible mais fournit réellement answer. Utilisez dir() pour explorer ou compléter, puis vérifiez la documentation et le comportement requis. getattr() et hasattr() peuvent exécuter le code de recherche d’attribut, et dir() du code personnalisé : ne supposez pas une absence automatique d’effets de bord.