Bạn có thể muốn chấp nhận các đối số được đặt tên gần như tùy ý vì một loạt các lý do - và đó là biểu mẫu **kw
cho phép bạn thực hiện.
Lý do phổ biến nhất là chuyển đối số ngay cho một số chức năng khác mà bạn đang gói (trang trí là một trường hợp này, nhưng FAR từ chỉ có duy nhất!) - trong trường hợp này, **kw
sẽ mất liên kết giữa wrapper và wrappee, vì trình bao bọc không phải biết hoặc quan tâm đến tất cả các đối số của trình bao bọc. Đây là một lý do hoàn toàn khác:
d = dict(a=1, b=2, c=3, d=4)
nếu tất cả các tên phải được biết trước, thì rõ ràng cách tiếp cận này không thể tồn tại, phải không? Và btw, khi áp dụng, tôi rất thích cách này thực hiện một dict có phím chuỗi chữ to:
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
đơn giản chỉ vì sau này là khá dấu chấm câu nặng và do đó ít có thể đọc được.
Khi không có lý do tuyệt vời nào để chấp nhận **kwargs
áp dụng, thì đừng chấp nhận: đơn giản như vậy. IOW, nếu không có lý do chính đáng để cho phép người gọi chuyển thêm tên args với tên tùy ý, đừng cho phép điều đó xảy ra - chỉ cần tránh đặt một biểu mẫu **kw
ở cuối chữ ký của hàm trong câu lệnh def
.
Đối với sử dụng**kw
trong một cuộc gọi, cho phép bạn đặt cùng các thiết lập chính xác các đối số tên mà bạn phải vượt qua, đều có giá trị tương ứng, trong một dict, độc lập với một điểm gọi duy nhất, sau đó sử dụng dict rằng tại điểm gọi duy nhất. Hãy so sánh:
if x: kw['x'] = x
if y: kw['y'] = y
f(**kw)
tới:
if x:
if y:
f(x=x, y=y)
else:
f(x=x)
else:
if y:
f(y=y)
else:
f()
Thậm chí chỉ với hai khả năng (! Và thuộc loại rất đơn giản), thiếu **kw
được aleady làm tùy chọn thứ hai hoàn toàn không có cơ sở và không thể chấp nhận - chỉ hãy tưởng tượng cách nó phát ra khi có nửa tá khả năng, có thể trong tương tác phong phú hơn một chút ... mà không có **kw
, cuộc sống sẽ là địa ngục tuyệt đối trong những hoàn cảnh như vậy!
Hãy suy nghĩ về varargs trong C - đôi khi bạn không thể biết những gì lập luận của bạn sẽ được. –
Vui lòng không sử dụng cụm từ "thế giới thực" - đó là tranh luận. Nó nói rằng "tất cả các ví dụ tôi đã nhìn thấy cho đến nay là contrived và vô ích; ứng dụng của tôi là thế giới thực, ví dụ của bạn là một thế giới tưởng tượng." Vui lòng thay đổi câu hỏi của bạn để loại bỏ "thế giới thực". –
Chỉ có người thích tranh luận mới nghĩ rằng câu hỏi của tôi là tranh luận. – meppum