Μετάβαση στο κύριο περιεχόμενο
🔒 Λειτουργία προεπισκόπησης. Τα πρώτα δεκαπέντε μαθήματα Foundations είναι δωρεάν· αυτό είναι Pro. Ξεκινήστε ένα 7ήμερο trial για να ξεκλειδώσετε τον επεξεργαστή, τις υποδείξεις AI και το υπόλοιπο του προγράμματος. Απαιτείται κάρτα, ακυρώνετε οποιαδήποτε στιγμή από το Dashboard.Ξεκινήστε 7ήμερο trial →
← ΜαθήματαSenior Deep-DivesModule 11 · Decorator patterns at scale@contextlib.contextmanager — context managers from generatorspredict154 / 161
+150 XP
Εργασία
📝 **Εργασία:** Προβλέψτε την έξοδο 11 γραμμών. Ένα «μέτρο(όνομα)» διακοσμημένο με «@contextmanager» εκτελεί τη ρύθμιση πριν από την απόδοση και το teardown μετά. Τρία με-μπλοκ: κανονική χρήση, ανύψωση σώματος-εξαίρεση (πιάστηκε έξω) και το ίδιο όνομα περιβάλλοντος επαναχρησιμοποιήθηκε δύο φορές (κάθε κλήση είναι μια νέα γεννήτρια). Δώστε προσοχή στη σειρά «<λήψης» έναντι «συλλαμβανόμενου σφάλματος δικτύου» — η τελική διακλάδωση εκτελείται ΠΡΙΝ διαφεύγει η εξαίρεση. 📋 Υλοποιήστε την παραπάνω λειτουργία. Οι δοκιμές εκτελούνται αυτόματα. 💡 **Υπόδειξη:** Ξαναδιάβασε τη θεωρία αν κολλήσεις.
Πρόβλεψε έξοδο

Διάβασε τον κώδικα προσεκτικά

from contextlib import contextmanager


events: list[str] = []


@contextmanager
def measure(name: str):
    events.append(f">{name}")
    try:
        yield {"name": name, "id": 42}
    finally:
        events.append(f"<{name}")


# 1. Normal use — yielded value bound to ctx
with measure("upload") as ctx:
    events.append(f"  inside: name={ctx['name']}, id={ctx['id']}")

# 2. Exception inside body — finally still runs, THEN exception escapes
try:
    with measure("download"):
        events.append("  download body")
        raise RuntimeError("network down")
except RuntimeError:
    events.append("  caught network error")

# 3. Same context name twice — each with-block creates a fresh generator
with measure("a"):
    pass
with measure("a"):
    pass

for e in events:
    print(e)

Τι θα εμφανίσει το πρόγραμμα; Γράψε εδώ:

💬 Συζήτηση

Γίνε ο πρώτος — κάνε μια ερώτηση ή μοιράσου μια συμβουλή.
Σύνδεση για να συμμετάσχεις στη συζήτηση. Η ανάγνωση είναι δωρεάν.
Φόρτωση συζήτησης…