2012-09-02 15 views
8

Dado el ejemplo a continuación, ¿cuál es más pitónico? Usando la composición de la función, lambdas o (ahora para) algo completamente diferente? Tengo que decir que las lambdas parecen ser más legible, pero el propio Guido parece querer quitar lambdas por completo - http://www.artima.com/weblogs/viewpost.jsp?thread=98196Cuál es más pythonic - composición de la función, lambdas, o algo más?

from functools import partial 
from operator import not_, ge 

def get_sql_data_type_from_string(s): 
    s = str(s) 

    # compose(*fs) -> returns composition of functions fs 
    # iserror(f, x) -> returns True if Exception thrown from f(x), False otherwise 

    # Using function composition 
    predicates = (
     ('int',  compose(not_, partial(iserror, int))), 
     ('float', compose(not_, partial(iserror, float))), 
     ('char', compose(partial(ge, 1), len))) 

    # Using lambdas 
    predicates = (
     ('int',  lambda x: not iserror(int, x)), 
     ('float', lambda x: not iserror(float, x)), 
     ('char', lambda x: len(x) <= 1)) 

    # Test each predicate 
    for i, (t, p) in enumerate(predicates): 
     if p(s): 
      return i, t 

    # If all predicates fail 
    return (i + 1), 'varchar' 
+1

Creo que la versión lambda es el más sencillo y claro, que también creo que hace que sea el más "Pythonic". –

+2

nitpick: de acuerdo con su definición de iserror, debería tener algo como 'iserror (int, x)' en oposición a 'iserror (int (x))'. –

+0

lambda es agradable – pyCthon

Respuesta

8

Un programador que nunca ha visto Python será capaz de averiguar la lambda de un vistazo . He estado usando Python durante más de diez años, y me estaba rascando la cabeza para descubrir la forma de composición, incluso con la versión lambda para comparar.

Ve por el que no apesta. Además, dado que lambda realizó el corte 3.0, dudo que alguna vez se elimine.

2

Aquí es un enfoque que entran en la categoría "diferente":

def get_sql_data_type_from_string(s): 
    s = str(s) 

    def char(x): 
     if len(x)<=1: 
      return x 
     raise RuntimeError('Not a char') 

    predicates = (
     ('int',  int), 
     ('float', float), 
     ('char', char) 
    ) 

    # Test each predicate 
    for i, (t, p) in enumerate(predicates): 
     try: 
      p(s) 
      return i,t 
     except: 
      pass 

    # If all predicates fail 
    return (i + 1), 'varchar' 
Cuestiones relacionadas