2012-03-01 29 views
6

Tôi có hàm Python yêu cầu một số tham số, một trong số đó là loại mô phỏng cần thực hiện. Ví dụ, các tùy chọn có thể là "mặt trời", "xem" hoặc "cảCách Pythonic để có lựa chọn 2-3 tùy chọn làm đối số cho hàm

là gì một cách Pythonic để cho phép người dùng thiết lập các

tôi có thể thấy các tùy chọn khác nhau:.?

  1. sử dụng một biến chuỗi và kiểm tra xem nó - vì vậy nó sẽ là func(a, b, c, type='solar')

  2. Đặt một số hằng số trong lớp và sử dụng func(a, b, c, type=classname.SOLAR)

  3. Nếu chỉ có hai lựa chọn (vì có một số chức năng của tôi) buộc nó vào một đối số True/False, bằng cách sử dụng một cái gì đó như func(a, b, c, do_solar=False) để làm cho nó sử dụng tùy chọn 'xem'.

Bất kỳ tùy chọn nào (hoặc các ý tưởng khác) về cách thức làm việc này của Pythonic?

+2

Bạn không nên sử dụng 'type' như tên lập luận của bạn, vì đó là một built-in ... –

Trả lời

3

Tôi không thích bất kỳ tùy chọn nào trong số đó.

Tôi muốn xác định hai hàm khác nhau, perform_solar(a, b, c)perform_view(a, b, c) và để người gọi quyết định cái nào bạn muốn sử dụng, theo thứ tự nào và với đối số nào.

Nếu lý do tại sao bạn nghĩ bạn phải đóng gói chúng thành một hàm duy nhất là chúng chia sẻ trạng thái, bạn nên chia sẻ trạng thái đó trong đối tượng và xác định hàm làm phương thức.

1

Bạn có thể sử dụng tùy chọn (từ khóa) lập luận như thế này

def func(a, b, c, **kw): 
    if kw.get('do_solar'): 
     # Do Solar 
    if kw.get('do_view'): 
     # Do view 
3

Nếu điểm Niklas' làm trong his answer không nắm giữ, tôi sẽ sử dụng một đối số chuỗi. Có các mô-đun Python trong thư viện chuẩn sử dụng các đối số tương tự. Ví dụ: csv.reader().

sim_func(a, b, c, sim_type='solar') 

Nhớ cung cấp lỗi hợp lý bên trong hàm, giúp mọi người hiểu nếu họ nhập sai.

def sim_func(a, b, c, sim_type='solar'): 
    sim_types = ['solar', 'view', 'both'] 
    if sim_type not in sim_types: 
     raise ValueError("Invalid sim type. Expected one of: %s" % sim_types) 
    ... 
2

Vì hàm là đối tượng trong python, bạn có thể xử lý * args như một danh sách các phương thức và chuyển các kiểu mô phỏng như arbitratry args vào cuối. Điều này sẽ có lợi ích cho phép bạn xác định các mô phỏng mới trong tương lai mà không cần phải cấu trúc lại mã này.

def func(a, b, c, *args): 
    for arg in args: 
     arg(a, b, c) 

def foosim(a, b, c): 
    print 'foosim %d' % (a + b + c) 

def barsim(a, b, c): 
    print 'barsim %d' % (a * b * c) 

Sử dụng:

func(2, 2, 3, foosim) 
func(2, 2, 3, barsim) 
func(2, 2, 3, foosim, barsim) 

Output:

foosim 7 
barsim 12 
foosim 7 
barsim 12 
+0

Tôi không có luật sư ngôn ngữ nhưng tôi đã nhìn thấy cách tiếp cận này trong mã tốt. Nó đòi hỏi các mô phỏng của bạn phải là các hàm riêng biệt, đó là một ý tưởng hay: anyway Các quy ước tốt khuyến khích lập trình tốt. – alexis

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