Decollo sull'idea di Raymond, ecco una fabbrica per la produzione involucri condizionali di questo tipo. Perché scrivere da solo quando si può avere Python per scriverle?
def makeandand(func):
return lambda x: func(x) if x else None
andandfloat = makeandand(float)
andandfloat('10.25')
>>> 10.25
andandfloat('')
>>> None
andand
non è esattamente Pythonic, ma io sono in perdita per un nome migliore. Forse trap
dal momento che stai intrappolando il valore non valido.
Vale la pena notare che un comune idioma Python è quello di andare avanti e provare a fare ciò che è necessario fare e gestire le eccezioni man mano che si presentano. Questo è chiamato EAFP, dalla massima "è più facile chiedere perdono che autorizzazione". Così forse un modo più Pythonic a scrivere che è:
def maketrap(func, *exceptions):
def trap(x):
try:
return func(x)
except exceptions or (Exception,):
return None
return andand
trapfloat = maketrap(float)
# optionally specify the exceptions to convert to a None return
# (default is to catch anything but you may want to allow some through)
trapfloat = maketrap(float, ValueError)
trapfloat = maketrap(float, ValueError, TypeError)
# if you don't want to store it (i.e. you only need it once or twice)...
maketrap(float)(x) # ... just call it immediately
Nel vostro caso d'uso, credo che questo approccio è una vittoria: si tratta in modo trasparente con nulla che può essere convertito in un float
, e fa "la cosa giusta "se viene passato un valore falsi-ma-convertibile a float
(come 0).
per simulare Ruby's andand: return (func (x) if (x non è None) else None). E magari inviamo argomenti extra facoltativi lungo: def andand (x, func, * args, ** kwargs) – tokland
Mi piace, con il suggerimento di tokland, è succinto e potente. –