AFAIU, vous voulez vous assurer que certains objets se comportent ("suivez une interface") plus tôt que l'utilisation réelle. Dans votre exemple, vous voulez savoir que les objets sont appropriés au moment de la création de l'instance, et non quand ils seront effectivement utilisés. En gardant à l'esprit que nous parlons ici de Python, je ne suggérerai pas assert
(que se passe-t-il si python -O
ou une variable d'environnement PYTHONOPTIMIZE est définie sur 1 lorsque votre programme s'exécute?) Ou la vérification des types spécifiques (car qui limite inutilement les types que vous pouvez utiliser), mais je vais suggérer au début des tests fonctionnalité, quelque chose le long des lignes:
def __init__(self, a_number, a_boolean, a_duck, a_sequence):
self.a_number= a_number + 0
self.a_boolean= not not a_boolean
try:
a_duck.quack
except AttributeError:
raise TypeError, "can't use it if it doesn't quack"
else:
self.a_duck= a_duck
try:
iter(a_sequence)
except TypeError:
raise TypeError, "expected an iterable sequence"
else:
self.a_sequence= a_sequence
je try… except… else
dans cette suggestion parce que je veux Définissez les membres d'instance uniquement si le test a réussi, même si le code est modifié ou augmenté. Vous n'êtes pas obligé de le faire, évidemment. Pour les arguments de fonction et les propriétés de paramétrage, je ne ferais pas ces tests à l'avance, j'utiliserais simplement les objets fournis et agirais sur les exceptions levées, à moins que les objets suspects ne soient utilisés après un long processus.
Le type Python échoue - n'échelle pas; Je préférerais utiliser Mono. –