8

以下の例を考えると、どちらがよりpythonicですか?関数の合成、ラムダ、または(今は)まったく異なるものを使用していますか?ラムダの方が読みやすいようですが、Guido自身がラムダを完全に削除したいと思っているようです-http ://www.artima.com/weblogs/viewpost.jsp?thread= 98196

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'
4

2 に答える 2

8

Pythonを見たことがないプログラマーは、ラムダを一目で理解できるようになります。私はPythonを10年以上使用しており、ラムダバージョンと比較する場合でも、頭をかいて構成形式を理解していました。

吸わないものを選びなさい。また、ラムダが3.0カットを行ったことを考えると、これが削除されることはないと思います。

于 2012-09-02T05:53:28.137 に答える
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'
于 2012-09-02T06:09:59.623 に答える