2012-09-02 22 views
8

In dem folgenden Beispiel, das mehr Python ist? Mit Funktionszusammensetzung, Lambdas oder (jetzt für) etwas ganz anderes? Ich muss sagen, dass die Lambda-Ausdrücke scheinen besser lesbar zu sein, aber Guido scheint sich zu wollen lambdas ganz entfernen - http://www.artima.com/weblogs/viewpost.jsp?thread=98196Was ist mehr Python - Funktion Zusammensetzung, Lambdas oder etwas anderes?

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

ich denke, die Lambda-Version der direkteste und klar ist, was ich denke, macht es auch die meisten „pythonic“. –

+2

Nitpick - entsprechend Ihrer Definition von iserror sollten Sie etwas wie 'iserror (int, x)' im Gegensatz zu 'iserror (int (x))' haben. –

+0

Lambdas sind nett – pyCthon

Antwort

8

Ein Programmierer, der Python nie gesehen hat, der Lage sein, den Lambda auf einen Blick, um herauszufinden, . Ich benutze Python seit über zehn Jahren, und ich kratzte mich am Kopf, um die Kompositionsform herauszufinden, sogar mit der Lambda-Version zum Vergleich.

Gehen Sie für die, die nicht saugen. Da Lambda den Schnitt von 3.0 gemacht hat, bezweifle ich, dass es jemals entfernt wird.

2

Hier ist ein Ansatz, der in die „anders“ Kategorie fallen würde:

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' 
Verwandte Themen