Làm cách nào để tạo hàm Python với các đối số tùy chọn?


218

Tôi có một hàm Python có một số đối số. Một số trong những đối số này có thể được bỏ qua trong một số tình huống.

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

Các đối số dthông qua hlà các chuỗi mà mỗi chuỗi có ý nghĩa khác nhau. Điều quan trọng là tôi có thể chọn tham số tùy chọn nào để vượt qua trong 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ả trong số họ (đây là những lựa chọn của tôi).

Sẽ thật tuyệt nếu tôi có thể làm quá tải hàm - 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ố đối số int cần thiết vào danh sách - và gặp lỗi không khớp đối số.

Ngay bây giờ tôi đang gửi các chuỗi trống thay cho một vài đối số bị thiếu đầu tiên dưới dạng 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 để làm điều này? Tôi có thể vượt qua một 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ư:

_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]

Câu trả lời:


193

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


245

Chỉ cần sử dụng *argstham số, cho phép bạn vượt qua bao nhiêu đối số bạn 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,fnhưng đó là một "cách" 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ác giá trị của c,d,e,f


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

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 đó kwargssẽ có một từ điển của tất cả các tham số được khóa có giá trị saua,b


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 điện với nhiều lỗ trống khác nhau trong danh sách của tôi, nhưng đây là một công cụ tuyệt vời được 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 tôi cần cho vấn đề của mình, tôi rất vui.
Thalia

12
Nó được gọi là Danh sách tranh luận tùy tiện
FabienB

@Nix, tôi thực sự thích câu trả lời của bạn. Tuy nhiên, bạn có thể vui lòng làm rõ những gì các tuyên bố c = kwargs.get('c', None)được sử dụng cho? Có yêu cầu trong mọi chức năng có tùy chọn args không? Trong mã của bạn, bạn chỉ có 2 đối số tùy chọn. Điều gì xảy ra nếu người dùng muốn một arg khác nói e? Làm cách nào tôi có thể thay đổi mã mẫu của bạn cho bất kỳ số lượng đối số tùy chọn không xác định nào, ví dụ : def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)? Tôi có phải bao gồm c = kwargs.get('c', None) etctrước khi làm obj.add(c, d, ...)?
Nemo

Nếu bạn lo lắng về sự phức tạp thời gian. Đây sẽ là một vấn đề
NduJay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.