Ich habe vor kurzem einen @sequenceable Decorator erstellt, der auf jede Funktion angewendet werden kann, die ein Argument akzeptiert, und bewirkt, dass sie automatisch auf jede Sequenz angewendet werden kann. Dies ist der Code (Python 2.5):Wie schrecklich ist mein Dekorateur?
def sequenceable(func):
def newfunc(arg):
if hasattr(arg, '__iter__'):
if isinstance(arg, dict):
return dict((k, func(v)) for k, v in arg.iteritems())
else:
return map(func, arg)
else:
return func(arg)
return newfunc
Im Einsatz:
@sequenceable
def unixtime(dt):
return int(dt.strftime('%s'))
>>> unixtime(datetime.now())
1291318284
>>> unixtime([datetime.now(), datetime(2010, 12, 3)])
[1291318291, 1291352400]
>>> unixtime({'start': datetime.now(), 'end': datetime(2010, 12, 3)})
{'start': 1291318301, 'end': 1291352400}
Meine Fragen sind:
- Ist dies eine schreckliche Idee, und warum?
- Ist das vielleicht eine gute Idee, hat aber erhebliche Nachteile wie implementiert?
- Was sind die möglichen Fallstricke von mit diesem Code?
- Gibt es eine eingebaute oder Bibliothek, die bereits tut, was ich tue?
Ist das nicht, was 'map' tut? Und listet das nicht auf? Warum fügen Sie einem bereits überfüllten Konzeptbereich eine dritte Technik hinzu? Bitte erklären Sie, wie sich dies gegenüber der Karten- und Listenkomprehension verbessert. –
Es verbessert nicht über map(). Es ist eine Kurzschrift * für * map(). Ich stimme map() wahrscheinlich nicht, aber eine Kurzschrift für Iteritems() -> Liste Verständnis -> dict() könnte einen Verdienst haben. –