J'ai une fonction qui, dans les cas les plus simples, fonctionne sur un itérable d'éléments.Gérer élégamment différents types de paramètres
def foo(items):
for item in items:
# do stuff
Parfois, je ne veux pas passer un itérable d'objets directement, mais plutôt un objet qui fournit une méthode pour obtenir les itératives:
def foo(obj):
for item in obj.iteritems():
# do same stuff as above
Je peux fusionner ces deux cas comme celui-ci :
def foo(obj):
try:
items = obj.iteritems()
except ValueError:
items = obj
for item in items:
# do stuff
Cela fonctionne très bien. Maintenant, je reçois un troisième cas d'utilisation qui ressemble à ceci:
def foo(objs):
for item in itertools.chain.from_iterable(obj.iteritems() for obj in objs):
# do same stuff again
je peux toujours utiliser l'approche try-except
, étant donné que les interfaces sont incompatibles. Cependant, la prise d'essai imbriquée commencerait à devenir très laide. Plus encore quand je veux ajouter un quatrième cas d'utilisation. Est-il possible de résoudre ce problème sans imbriquer les blocs try
?
Ah, je * souhaite * qu'il y ait des surcharges de fonctions correctes en Python! –
@ André: presque toujours en Python, si vous voulez ce type de surcharge de fonction/méthode, vous le faites mal. –
Mais quel est le problème avec l'envoi explicite de l'itérable? trop verbeux? – tokland