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.




