2012-03-02 17 views
63

Tôi có một hàm Python có nhiều đối số. Một số các đối số này có thể được bỏ qua trong một số trường hợp.Làm cách nào để tạo một hàm Python với các đối số tùy chọn?

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None): 
    #code 

Những lập luận d qua h là chuỗi mà mỗi người đều có ý nghĩa khác nhau. Điều quan trọng là tôi có thể chọn tham số tùy chọn để chuyển vào bất kỳ kết hợp nào. Ví dụ: (a, b, C, d, e) hoặc (a, b, C, g, h) hoặc (a, b, C, d, e, f hoặc tất cả chúng (đây là những lựa chọn của tôi).

Sẽ rất tuyệt nếu tôi có thể làm quá tải chức năng - nhưng tôi đã đọc rằng Python không hỗ trợ quá tải. Tôi đã cố gắng để chèn một số các đối số int cần thiết trong danh sách - và có một lỗi đối số không khớp.

Hiện tại, tôi đang gửi các chuỗi rỗng thay cho các đối số thiếu đầu tiên như trình giữ chỗ. Tôi muốn có thể gọi một hàm chỉ bằng cách sử dụng các giá trị thực tế.

Có cách nào để thực hiện việc này không? Tôi có thể chuyển danh sách thay vì danh sách đối số không?

Ngay bây giờ nguyên mẫu sử dụng ctypes trông giống như sau:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p] 
+0

liên quan: [gì ** (double sao/dấu hoa thị) và * (sao/dấu hoa thị) làm cho các thông số ?] (https://stackoverflow.com/q/36901/3357935) –

Trả lời

74

Hãy thử gọi nó thích: obj.some_function('1', 2, '3', g="foo", h="bar"). Sau các đối số vị trí cần thiết, bạn có thể chỉ định các đối số tùy chọn cụ thể theo tên.

94

Chỉ cần sử dụng tham số * args, cho phép bạn chuyển nhiều đối số theo ý muốn sau a,b,c. Bạn sẽ phải thêm một số logic vào bản đồ args-> c, d, e, f nhưng nó là một "cách" của quá tải.

def myfunc(a,b, *args, **kwargs): 
    for ar in args: 
     print ar 
myfunc(a,b,c,d,e,f) 

Và nó sẽ in c,d,e,f


Tương tự như vậy bạn có thể sử dụng đối số kwargs và sau đó bạn có thể đặt tên cho thông số của bạn.

def myfunc(a,b, *args, **kwargs): 
     c = kwargs.get('c', None) 
     d = kwargs.get('d', None) 
     #etc 
myfunc(a,b, c='nick', d='dog', ...) 

Và sau đó kwargs sẽ có một cuốn từ điển của tất cả các thông số đó là chìa khóa có giá trị sau khi a,b

+0

Cảm ơn bạn. Mặc dù tôi không thể sử dụng tính linh hoạt này trong mã của mình, và nó không giải quyết được vấn đề gọi với các lỗ trống trong danh sách của tôi, nó là một công cụ tuyệt vời để sử dụng trong một dự án khác. và Russel Borogove đã cho tôi câu trả lời chính xác mà tôi cần cho vấn đề của mình, tôi hạnh phúc. – Thalia

+5

Nó được gọi là [Danh sách đối số tùy ý] (http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – FabienB