2012-09-02 23 views
8

नीचे दिए गए उदाहरण को देखते हुए, जो अधिक पायथनिक है? फ़ंक्शन संरचना, लैम्बडास, या (अब के लिए) का उपयोग करना पूरी तरह से अलग? मैं कहना है कि lambdas अधिक पठनीय होने लगते है, लेकिन गुइडो खुद को पूरी तरह lambdas निकालना चाहते हैं लगता है - 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' 
+1

मुझे लगता है कि लैम्ब्डा संस्करण सबसे सरल और स्पष्ट है, जो मैं भी लगता है कि यह सबसे "pythonic" बनाता है। –

+2

नाइटपिक - आतंक की आपकी परिभाषा के अनुसार, आपके पास 'आतंक (int, x)' के रूप में कुछ होना चाहिए जैसा कि 'आतंक (int (x)) के विपरीत है। –

+0

लैम्ब्डा अच्छा – pyCthon

उत्तर

8

एक प्रोग्रामर जो कभी नहीं देखा है अजगर एक नज़र में लैम्ब्डा यह पता लगाने में सक्षम हो जाएगा । मैं दस वर्षों से पाइथन का उपयोग कर रहा हूं, और मैं लैम्ब्डा संस्करण के साथ तुलना करने के लिए भी रचना फॉर्म को समझने के लिए अपने सिर को खरोंच कर रहा था।

चूसने वाले व्यक्ति के लिए जाएं। इसके अलावा, यह देखते हुए कि लैम्ब्डा ने 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'