[wiki: Protocoles]
—-
Concept général
Les « protocoles » permettent au développeur de définir des classes combinables avec certaines instructions prédéfinies du langage.
—-
Protocole de fonction
#!comment
Les differentes entités (avec état) que l'on peut fournir à un client attendant une fonction :
- fonction avec variables globales
- fonction avec enclosing-function scope references
- fonction avec default mutable arguments
- lambda-fonction avec argument par defaut
- un objet doté d'une méthode
call - méthode liée à un objet
- un "générateur" (utilisant yield) ?
Utilisation
Dans tout code qui s’attend à une fonction, et qui va utiliser l’objet en lui fournissant un ou plusieurs arguments entre parenthèses.
Attendus
- une méthode !call()!
Objets qui répondent déjà à ce protocole
- fonction classique
- fonction lambda
- méthode liée à un objet
—-
Protocole d’itération
Cherche d’abord !iter!(), qui doit retourner un iterateur (objet avec méthode next()),
puis à défaut cherche !getitem!().
Attention à ce qu’ !iter!() renvoie des objets bien autonomes,
par exemple pour permettre des doubles boucles.
—-
Protocole des gestionnaires de contexte
With/as : une sorte de try/finally pour les objets qui respectent le protocole des gestionnaires de contexte, à savoir possèdent des méthodes !enter! et !exit! .
#!comment
Optionnel en 2.5 (from !future! import with_statement), standard en 2.6
with expression [as variable]:
...