← retour aux snippets

typing: Protocol pour duck typing statique

Définir un contrat d'interface et l'utiliser sans héritage explicite.

objectif

Définir un contrat d’interface et l’utiliser sans héritage explicite.

code minimal

from typing import Protocol

class HasArea(Protocol):
    def area(self) -> float: ...

class Square:
    def __init__(self, s: float): self.s = s
    def area(self) -> float: return self.s * self.s

class Circle:
    def __init__(self, r: float): self.r = r
    def area(self) -> float: return 3.14159 * self.r * self.r

def total_area(shapes: list[HasArea]) -> float:
    return sum(s.area() for s in shapes)

print(int(total_area([Square(2), Circle(1)]) * 100) ==  (4 + 3.14159) * 100 // 1)

utilisation

print(True)

variante(s) utile(s)

from typing import Protocol, runtime_checkable
@runtime_checkable
class P(Protocol):
    def ping(self) -> str: ...
class X:
    def ping(self) -> str: return "pong"
print(isinstance(X(), P))

notes

  • Protocol décrit une interface attendue (duck typing).
  • Utile avec mypy/pyright pour détecter tôt les écarts.