2010-10-07 29 views
21

Tôi đang phát xung quanh với một cổng đơn giản của API Protovis tới Python.Thiết kế một API Python: Giao diện thông thạo hoặc đối số

Hãy xem xét các ví dụ đơn giản biểu đồ thanh, trong Javascript:

var vis = new pv.Panel() 
    .width(150) 
    .height(150); 

vis.add(pv.Bar) 
    .data([1, 1.2, 1.7, 1.5, .7, .3]) 
    .width(20) 
    .height(function(d) d * 80) 
    .bottom(0) 
    .left(function() this.index * 25); 

vis.render(); 

Tôi đang cân nhắc có nên tiếp tục sử dụng giao diện phong cách API thạo này hoặc sử dụng tên thông số để thay thế. Với thông số được đặt tên, chúng tôi có thể viết:

vis = pv.Panel(width=150, 
       height=150) 

vis = vis + pv.Bar(data=[1, 1.2], 
        width=20, 
        height=lambda d: d * 80, 
        bottom=0, 
        left=lambda: self.index * 25) 
vis.render() 

Có kiểu Python ưa thích không?

+0

Thú vị. Tôi đã nhìn thấy cả hai. Ví dụ: Django sử dụng cả hai: phương thức chuỗi và đối số từ khóa. –

+1

Có lẽ đó chỉ là tôi, nhưng tôi nghĩ rằng nó là cả hai xấu xí: P – poke

+1

Lợi thế của cú pháp từ khóa là bạn có thể sử dụng một cái gì đó như 'pv.Bar (** kwargs)' dễ dàng hơn so với API thông thạo. Ngoài ra, như tôi đã thấy nó trong JavaScript với jQuery, rất nhiều chức năng ẩn danh được sử dụng - những điều này không ánh xạ tốt với Python. –

Trả lời

21

Bỏ phiếu của tôi là chống chaining, pro-named-params.

  1. dot-chaining làm cho người nghèo mã IntelliSense từ nguyên mẫu thực nghiệm chỉ là một ban rỗng() hoặc Bar(), bạn có thể tất nhiên pydoc vào nó, nhưng trong ngày và tuổi tác IntelliSense này có sẵn trong hầu hết các IDE và tăng cường năng suất tuyệt vời.

  2. Việc tạo chuỗi làm cho việc lập trình gọi lớp khó khăn hơn nhiều. Thật tuyệt khi có thể chuyển vào một danh sách hoặc dict như * args, ** kwargs - trong khi có thể với chuỗi bạn về cơ bản phải hỗ trợ cả hai phương thức hoặc một loạt các backflips để tạo meta class.

  3. Việc tạo chuỗi khiến mã khó đọc hơn vì chắc chắn ai đó sẽ làm tất cả trên một dòng và tự hỏi tại sao mọi thứ đều bị thay đổi khi chúng vượt qua cùng một thông số hai lần - bạn có thể ngăn chặn điều đó bộ lọc dup constructor param được đặt tên cơ bản được tích hợp sẵn.

Các vấn đề liên quan