Die Python-Funktion dir() liefert eine alphabetisch sortierte Liste der Namen, die einem Objekt zugeordnet sind — Attribute, Methoden, Klassenvariablen und mehr. Ohne Argument zeigt dir() alle Namen im aktuellen lokalen Scope. dir() ist eines der wichtigsten Werkzeuge für Introspection und interaktive Erkundung von Modulen, Klassen oder fremden Bibliotheken.
Einleitung
Wer mit einer neuen Bibliothek, einem unbekannten Objekt oder einer komplexen Klasse arbeitet, weiß oft nicht, welche Methoden zur Verfügung stehen. dir() schafft hier sofort Übersicht: Statt in der Dokumentation zu suchen, lässt sich das Objekt direkt im REPL „auseinandernehmen".
dir() ruft intern die Methode __dir__() des Objekts auf. Klassen, Module und die meisten Builtin-Typen implementieren das sinnvoll, Custom-Klassen können __dir__() überschreiben.
Syntax
dir() # Namen im aktuellen lokalen Scope
dir(object) # Attribute und Methoden des Objektsobject Ein beliebiges Python-Objekt: Modul, Klasse, Instanz, Funktion, Builtin-Typ. Kann weggelassen werden.
Rückgabewert
Eine alphabetisch sortierte list[str] mit allen Namen, die zum Objekt gehören. Ohne Argument: alle Namen im aktuellen lokalen Scope (lokale Variablen, importierte Module, Funktionen, Klassen).
Beispiele
Methoden eines Strings
# Alle dunder-Methoden ausfiltern für mehr Übersicht
methods = [m for m in dir("Hallo") if not m.startswith("_")]
print(methods)['capitalize', 'casefold', 'center', 'count', 'encode', ...]Inhalt eines Moduls
import math
print([n for n in dir(math) if not n.startswith("_")][:8])['acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'cbrt']Aktueller Scope ohne Argument
x = 1
y = "hallo"
def func(): pass
print([n for n in dir() if not n.startswith("_")])['func', 'x', 'y']Klassen-Inspection
class Car:
color = "rot"
def fahren(self): pass
print([n for n in dir(Car) if not n.startswith("_")])['fahren', 'color']Praktische Beispiele
Eigene __dir__()-Methode definieren
class DynamicAttrs:
def __init__(self):
self._daten = {"name": "Michael", "alter": 34}
def __getattr__(self, name):
if name in self._daten:
return self._daten[name]
raise AttributeError(name)
def __dir__(self):
# Dynamische Attribute mit aufnehmen
return list(super().__dir__()) + list(self._daten)
obj = DynamicAttrs()
print([n for n in dir(obj) if not n.startswith("_")])['alter', 'name']Methoden mit bestimmtem Namens-Pattern finden
# Alle "is_*"-Methoden eines Strings
s = "Hallo"
is_methoden = [m for m in dir(s) if m.startswith("is")]
print(is_methoden[:5])['isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit']Diff zwischen zwei Objekten
# Was hat eine Liste, was ein Tupel nicht hat?
unique = set(dir(list)) - set(dir(tuple))
print(sorted(m for m in unique if not m.startswith("_")))['append', 'clear', 'copy', 'extend', 'insert', 'pop', 'remove', 'reverse', 'sort']Praktische Hinweise
- REPL-Tipp:
dir(obj)ist der schnellste Weg, ein neues Objekt zu erkunden — gefolgt vonhelp(obj.method)für Details. - Filterung: Dunder-Methoden (
__name__) füllen die Liste — meist mit[m for m in dir(x) if not m.startswith("_")]filtern. - Custom
__dir__: Klassen können__dir__()überschreiben, um die Ausgabe gezielt zu steuern (z. B. dynamische Attribute aus__getattr__zu listen). - Verwandte Funktionen:
vars()zeigt das__dict__,getattr()/hasattr()greifen einzeln zu,inspect-Modul liefert tiefere Introspection.