8

以下の例では、これはもっとpythonicですか?関数の構成、lambdas、または(今のところ)を使って全く別のもの?私は、ラムダが読みやすくなるように見えることを言っているが、グイド自身が完全にラムダを削除するようだ - http://www.artima.com/weblogs/viewpost.jsp?thread=98196さらに多くのpythonic - 機能の構成、ラムダ、または何か他のですか?

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

私はラムダのバージョンは私もそれほとんどの「神託」を作ると思われ、最も簡単かつ明確であると思います。 –

+2

nitpick - あなたのiserrorの定義によると、iserror(int(x))ではなく、iserror(int、x)のようなものが必要です。 –

+0

ラムダは素敵です – pyCthon

答えて

8

のPythonを見たことがなかったプログラマが一目でラムダを把握することができるようになります。私はPythonを10年以上使用していましたが、ラムダ版を比較しても構わないと思っていました。

吸っていない方に行ってください。また、ラムダが3.0カットを作ったとすれば、それは削除されることはないだろう。ここで

2

は「異なる」カテゴリに分類されますアプローチです:

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' 
関連する問題