Aller au contenu principal
🔒 Mode aperçu. Les quinze premières leçons Foundations sont gratuites ; celle-ci est Pro. Démarrez un trial de 7 jours pour débloquer l'éditeur, les conseils AI et le reste du programme. Carte requise, annulez à tout moment dans Dashboard.Démarrer le trial de 7 jours →
← CoursSenior Deep-DivesModule 10 · Production idioms (modern Python)typing.Self (3.11+) — fluent builders that subclass correctlypredict146 / 161
+150 XP
Tâche
📝 **Tâche :** Prédisez la sortie à 4 lignes. Une classe Query possède des méthodes chaînables renvoyant Self. Une sous-classe TimedQuery ajoute « .slow(ms) ». Deux versions : une avec Query, une avec TimedQuery. Chacun imprime le SQL rendu et `type(q).__name__` pour confirmer que Self a préservé l'identité de la sous-classe tout au long de la chaîne. 📋 Implémentez la fonction ci-dessus. Les tests s'exécutent automatiquement. 💡 **Indice :** Relisez la théorie si vous êtes bloqué.
Prédis la sortie

Lis le code attentivement

from typing import Self


class Query:
    def __init__(self) -> None:
        self.table: str = ""
        self.filters: list[str] = []
        self.limit_: int | None = None

    def from_(self, table: str) -> Self:
        self.table = table
        return self

    def where(self, cond: str) -> Self:
        self.filters.append(cond)
        return self

    def limit(self, n: int) -> Self:
        self.limit_ = n
        return self

    def build(self) -> str:
        clauses = [f"SELECT * FROM {self.table}"]
        if self.filters:
            clauses.append("WHERE " + " AND ".join(self.filters))
        if self.limit_:
            clauses.append(f"LIMIT {self.limit_}")
        return " ".join(clauses)


class TimedQuery(Query):
    def slow(self, ms: int) -> Self:
        self.filters.append(f"duration_ms > {ms}")
        return self


q = (
    Query()
    .from_("users")
    .where("active = true")
    .where('created_at > "2026-01-01"')
    .limit(10)
)
print(q.build())
print(type(q).__name__)

t = (
    TimedQuery()
    .from_("requests")
    .slow(500)
    .where('path = "/api"')
    .limit(20)
)
print(t.build())
print(type(t).__name__)

Que va afficher le programme ? Écris ici :

💬 Discussion

Soyez le premier à poser une question ou partager une astuce.
Connectez-vous pour rejoindre la discussion. La lecture est gratuite.
Chargement de la discussion…