Thật vậy, khi bạn thực hiện bla[x,y]
, bạn đang gọi điện thoại type(bla).__getitem__(bla, (x, y))
- Python tự động hình thức tuple dành cho bạn và chuyển nó lên số __getitem__
làm đối số thứ hai (đối số đầu tiên là self
). Không có cách nào tốt là [1] để thể hiện rằng __getitem__
muốn nhiều đối số hơn, nhưng cũng không cần.
[1] Trong Python 2.*
bạn có thể thực sự cung cấp __getitem__
một chữ ký tự động giải nén mà sẽ nâng cao ValueError
hoặc TypeError
khi bạn đang lập chỉ mục với quá nhiều hoặc quá ít chỉ số .. .:
>>> class X(object):
... def __getitem__(self, (x, y)): return x, y
...
>>> x = X()
>>> x[23, 45]
(23, 45)
Cho dù đó là "một cách tốt" là tranh luận ... nó không được dùng trong Python 3 để bạn có thể phỏng đoán rằng Guido đã không không xem xét nó tốt khi phản ánh dài ;-). Việc giải nén của riêng bạn (của một đối số duy nhất trong chữ ký) không phải là vấn đề lớn và cho phép bạn cung cấp các lỗi rõ ràng hơn (và những cái thống nhất, chứ không phải là các kiểu khác nhau cho lỗi rất giống nhau khi lập chỉ mục ví dụ như vậy với 1 vs, 3 chỉ số ;-).
Nguồn
2009-11-06 04:37:41
Sự hiểu biết của tôi về việc không sử dụng đối số giải nén trong 3.x không nhiều đến mức "Guido không coi nó là tốt", nhưng càng khó có ai biết tính năng này thậm chí còn tồn tại trong ngôn ngữ và . –
@Laurence, yep - phức tạp và rất hiếm khi được sử dụng -> không tốt! -) –
Tôi thường xuyên sử dụng nó và nó đã được khá tốt đẹp, nhưng vấn đề là nó phản ánh phức tạp. Tôi chủ yếu sẽ bỏ lỡ nó để sử dụng trong các hàm lambda – Casebash