Manchmal möchte man, dass man "normale" Argumente direkt übergeben kann, aber kompliziertere Argumente (lists) automatisch iteriert werden.
Man kann dann vermeiden, dass man durch einen dummen Schreibfehler nur noch Murx erzeugt. Leider ist das in Python alles andere als einfach, das Strings iterierbar sind, und "alte" Iteratoren kein
iter_ kennen.
Beispiel:
Statt
for a in filter(filterfunktion, list): ob.fn(a)
möchte man lieber
ob.fn(filter(filterfunktion, list))
schreiben können, vorausgesetzt ob.fn() kann sowieso nicht auf List-Typen angewendet werden weil es einen primitiven Typen voraussetzt (Zahlen, Complex, Strings, etc.) und sie gibt nichts zurück.
Das Problem dabei ist, wenn ob.fn() einfach lositeriert und man
ob.fn("Hallo Welt")
aufruft, dann iteriert die Funktion über die Zeichen des Strings (da der String ja iterierbar ist).
Der Trick:
def auto_iterating_fn(arg):
try:
if isinstance(arg,basestring): raise TypeError()
iter(arg)
except TypeError:
arg=(arg,)
for a in arg:
print a # do whatever is needed with arg