Thực hiện Mapping
ABC. Về mặt kỹ thuật, các tài liệu ngôn ngữ không chỉ định phương thức Mapping
nào được sử dụng, vì vậy giả sử bạn chỉ cần một số tập con được sử dụng bởi việc triển khai hiện tại là một ý tưởng tồi. All it says is:
Nếu cú pháp ** biểu hiện xuất hiện trong lệnh gọi hàm, biểu thức phải đánh giá bản đồ, nội dung được coi là đối số từ khóa bổ sung. Trong trường hợp của một từ khóa xuất hiện trong cả hai biểu thức và như một đối số từ khóa rõ ràng, một ngoại lệ TypeError được nâng lên.
Vì vậy, nếu bạn thực hiện Mapping
ABC, bạn chắc chắn có các giao diện đúng, bất kể nó dựa trên .items()
, lặp đi lặp lại trực tiếp và __getitem__
cuộc gọi vv
FYI, về kiểm tra, hành vi trong CPython 3.5 chắc chắn phụ thuộc vào cách thực hiện bạn thực hiện Mapping
(nếu bạn kế thừa từ dict
, nó sử dụng đường dẫn được tối ưu hóa truy cập trực tiếp dict
internals, nếu không, nó lặp lại .keys()
và tra từng phím khi nó đi). Vì vậy, yeah, không cắt góc, thực hiện toàn bộ ABC. Nhờ mặc định triển khai kế thừa từ Mapping
ABC và cha mẹ của nó, điều này có thể được thực hiện với ít nhất là:
class MyMapping(Mapping):
def __getitem__(self, key):
...
def __iter__(self):
...
def __len__(self):
...
Việc triển khai mặc định bạn kế thừa có thể không tối ưu trong trường hợp cụ thể (ví dụ items
và values
sẽ làm semi-ác các công cụ liên quan đến việc lặp lại và tra cứu, nơi những người truy cập trực tiếp có thể nhanh hơn tùy thuộc vào nội bộ), vì vậy nếu bạn sử dụng nó cho các mục đích khác, tôi khuyên bạn nên ghi đè những người có phiên bản được tối ưu hóa.
Xuất sắc. Cảm ơn bạn rất nhiều, chưa bao giờ nghe nói về 'Lập bản đồ' trước đây! –