2011-10-26 6 views

risposta

9

Noi non avere uno di quelli, ma non è difficile rotolare il proprio:

def andand(x, func): 
    return func(x) if x else None 

>>> x = '10.25' 
>>> andand(x, float) 
10.25 
>>> x = None 
>>> andand(x, float) is None 
True 
+3

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

+0

Mi piace, con il suggerimento di tokland, è succinto e potente. –

4

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).

+0

Questa soluzione è creativa e sicuramente utile in alcuni casi d'uso. Ma non voglio creare wrapper per ogni singolo metodo che utilizzo, specialmente se lo utilizzo solo una volta o due. –

+0

@Andres: puoi chiamarlo immediatamente per quei casi d'uso una tantum: 'maketrap (float) (" 2.5 ")' ecc. – kindall

Problemi correlati