Mam funkcję, która w najprostszych przypadkach działa na elementach, które można iterować.Elegancko obsługiwane różne typy parametrów
def foo(items):
for item in items:
# do stuff
Czasami nie chcę przekazać mu iterowalny elementów bezpośrednio, ale raczej obiekt, który zapewnia sposób, aby uzyskać iterable:
def foo(obj):
for item in obj.iteritems():
# do same stuff as above
mogę połączyć te dwa przypadki, jak ten :
def foo(obj):
try:
items = obj.iteritems()
except ValueError:
items = obj
for item in items:
# do stuff
Działa to dobrze. Teraz dostaję przypadek użycia trzeciego, który wygląda tak:
def foo(objs):
for item in itertools.chain.from_iterable(obj.iteritems() for obj in objs):
# do same stuff again
mogę nadal stosować metodę try-except
, ponieważ interfejsy są niekompatybilne. Jednak zagnieżdżona próba catch zaczęłaby być bardzo brzydka. Bardziej, gdy chcę dodać czwarty przypadek użycia. Czy istnieje sposób na rozwiązanie tego problemu bez zagnieżdżania bloków try
?
Ah, ja * więc * żałuję, że w Pythonie nie było przeciążenia funkcji! –
@ André: prawie zawsze w Pythonie, jeśli chcesz przeciążać funkcje/metody, robisz to w niewłaściwy sposób. –
Ale jaki jest problem z wysyłaniem jawnie wersji iteracyjnej? zbyt szczegółowe? – tokland