2012-09-02 22 views
8

Đưa ra ví dụ dưới đây, đó là thêm pythonic? Sử dụng thành phần hàm, lambdas hoặc (bây giờ cho) một cái gì đó hoàn toàn khác nhau? Tôi phải nói rằng lambdas dường như dễ đọc hơn, nhưng Guido mình dường như muốn loại bỏ lambdas hoàn toàn - http://www.artima.com/weblogs/viewpost.jsp?thread=98196Thành phần chức năng nhiều hơn nữa, lambdas, hoặc cái gì khác?

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

Tôi nghĩ rằng phiên bản lambda là đơn giản nhất và rõ ràng, mà tôi cũng nghĩ làm cho nó nhiều nhất "pythonic". –

+2

nitpick - theo định nghĩa của bạn về iserror, bạn nên có một cái gì đó như 'iserror (int, x)' trái với 'iserror (int (x))'. –

+0

lambda là đẹp – pyCthon

Trả lời

8

Một lập trình viên chưa bao giờ nhìn thấy Python sẽ có thể tìm ra các lambda trong nháy mắt . Tôi đã sử dụng Python trong hơn mười năm, và tôi đã gãi đầu để tìm ra hình thức sáng tác, ngay cả với phiên bản lambda để so sánh.

Hãy chọn cái không hút. Ngoài ra, cho rằng lambda thực hiện cắt 3.0, tôi nghi ngờ nó sẽ bao giờ được gỡ bỏ.

2

Dưới đây là một cách tiếp cận đó sẽ rơi vào thể loại "khác nhau":

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' 
Các vấn đề liên quan