Python’s built-in collection types come in mutable and immutable flavours, but one is conspicuously missing:
list | tuple |
________số 8 | frozenset |
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']0 | ??? |
Đâu là ____ ____1111? Nó có thể hữu ích…
PEP 416 đã đề xuất một loại
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']1 cho Python 3.3, vào năm 2012. PEP đã bị từ chối, vì một số lý do chính đáng. Lý do bao gồm một số câu hỏi về tiện ích của một dict bất biến, đáng để kiểm tra trước khi bạn thêm chúng vào mã của mình.
Nhưng PEP đã cung cấp cho chúng tôi một công cụ để mô phỏng các ____10s bất biến:
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']4. Loại này là một proxy chỉ đọc cho ____10 hoặc ánh xạ khác. Python sử dụng loại này trong nội bộ cho các từ điển quan trọng, đó là lý do tại sao bạn có thể các loại tích hợp khỉ tích. Thay đổi duy nhất trong Python 3.3 là để hiển thị loại này cho mã người dùng.
.
Cách sử dụng In [1]: power_levels["Kevin"]
Out[1]: 9001
In [2]: power_levels["Benny"]
Out[2]: 8000
In [3]: list[power_levels.keys[]]
Out[3]: ['Kevin', 'Benny']
8
Để tạo ra một chế độ bất biến của người Viking, hãy tạo ra một
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']8 từ dict
from types import MappingProxyType power_levels = MappingProxyType[ { "Kevin": 9001, "Benny": 8000, } ]
Bạn có thể đọc từ proxy ánh xạ với tất cả các phương pháp thông thường:
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']
Nhưng, mọi nỗ lực thay đổi giá trị sẽ dẫn đến
In [4]: power_levels["Benny"] = 9200 --------------------------------------------------------------------------- TypeError Traceback [most recent call last] in ----> 1 power_levels["Benny"] = 9200 TypeError: 'mappingproxy' object does not support item assignment0:
In [4]: power_levels["Benny"] = 9200 --------------------------------------------------------------------------- TypeError Traceback [most recent call last] in ----> 1 power_levels["Benny"] = 9200 TypeError: 'mappingproxy' object does not support item assignment
Noice.
Vì không có tài liệu tham khảo nào về
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']0 cơ bản, nó không thể thay đổi.
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']0 có thể truy cập được thông qua bất kỳ thuộc tính nào trên
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']8 hoặc chỉ có tham chiếu chỉ có trong một con trỏ cấp C vô hình.
Nếu bạn giữ lại một tham chiếu đến
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']0 trong biến thứ hai, bất kỳ đột biến nào của nó sẽ hiển thị trong proxy:
In [5]: original = {"kevin": 9001} In [6]: proxy = MappingProxyType[original] In [7]: proxy["kevin"] Out[7]: 9001 In [8]: original["kevin"] = 9002 In [9]: proxy["kevin"] Out[9]: 9002
Cách tạo các bản sao đột biến
Để tạo một bản sao của proxy ánh xạ bằng các thay đổi, bạn có thể sử dụng toán tử Merge Dict Python 3.9. Hợp nhất proxy ánh xạ với một dict mới và chuyển kết quả cho
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']8:
In [10]: benny_better = MappingProxyType[power_levels | {"Benny": 9200}] In [11]: benny_better Out[11]: mappingproxy[{'Kevin': 9001, 'Benny': 9200}]
Để sửa đổi phức tạp hơn, bạn có thể sao chép proxy ánh xạ vào một ____10 mới, thực hiện các thay đổi và sau đó chuyển đổi kết quả thành proxy ánh xạ:
In [12]: new_world = power_levels | {} In [13]: del new_world["Benny"] In [14]: del new_world["Kevin"] In [15]: new_world["Bock"] = 100 In [16]: new_world = MappingProxyType[new_world] In [17]: new_world Out[17]: mappingproxy[{'Bock': 100}]
Yabba-dabba-doo!
Gói bữa tiệc thrid
Có một số gói bên thứ ba cung cấp các cấu trúc dữ liệu bất biến, chẳng hạn như bất biến và pyrsistent. Chúng có API API đẹp hơn một chút, nhưng đi kèm với các sự đánh đổi khác nhau như hiệu suất và trạng thái bảo trì. Bạn có thể muốn nghiên cứu chúng nếu
In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list[power_levels.keys[]] Out[3]: ['Kevin', 'Benny']8 không làm việc cho bạn, nhưng tôi đã khuyến khích sử dụng thư viện tiêu chuẩn càng nhiều càng tốt.
Vây
Có thể dữ liệu của bạn chỉ đột biến khi bạn muốn nó,
—Adam
Tìm hiểu làm thế nào để làm cho các bài kiểm tra của bạn chạy nhanh chóng trong cuốn sách của tôi tăng tốc các bài kiểm tra django của bạn.
Một email tóm tắt một tuần, không spam, tôi pinky hứa.
Bài viết liên quan:
- Mẫu tập lệnh Python với các lệnh phụ [và gõ gợi ý]
- Cách tạo bí danh thuộc tính minh bạch trong Python
- Bài kiểm tra được bảo trì tốt: 12 câu hỏi cho các phụ thuộc mới
Tags: Python python