Khi tìm kiếm cách làm việc với các từ điển lồng nhau, tôi đã tìm thấy mã sau đây được đăng bởi nosklo, mà tôi muốn được giải thích, vui lòng.Trong python, lớp AutoVivification sau hoạt động như thế nào?
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
Thử nghiệm:
a = AutoVivification()
a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6
print a
Output:
{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}
Tôi là một lập trình viên người mới khá. Tôi đã học được hầu hết những gì tôi biết về thời gian của mình ở bên cạnh, với sự huấn luyện chính thức duy nhất của tôi là về Turbo Pascal ở trường trung học. Tôi hiểu và có thể sử dụng các lớp theo những cách đơn giản, chẳng hạn như sử dụng __init__
, phương pháp lớp và lưu trữ dữ liệu trong các phiên bản của lớp học với foo.man = 'choo'
.
Tôi không biết làm cách nào mà hàng loạt dấu ngoặc vuông được chỉ dẫn, chính xác, thông qua lớp (tôi đoán họ đang gọi __getitem__
bằng cách nào đó) và không hiểu cách chúng được xử lý một cách chính xác mà không cần phải gọi phương thức ba lần riêng lẻ.
Tôi đã có ấn tượng rằng (dict)
trong tuyên bố lớp học sẽ được xử lý bởi __init__
.
Tôi đã sử dụng try: except:
trước đây, mặc dù một lần nữa, theo những cách khá đơn giản. Nó trông giống như tôi try
, khi nó chạy, đang gọi một loạt các chức năng __getitem__
. Tôi thu thập rằng nếu từ điển của cấp độ hiện tại tồn tại, thử sẽ vượt qua và đi đến từ điển tiếp theo. Các except
, tôi thu thập, chạy khi có một KeyError
nhưng tôi đã không nhìn thấy self
được sử dụng như thế trước đây. Self
đang được đối xử như một từ điển trong khi tôi nghĩ rằng self
là một ví dụ của class AutoVivification
... là cả hai? Tôi chưa bao giờ được chỉ định hai lần liên tiếp như thế này foo = man = choo
nhưng nghi ngờ rằng value
trỏ đến self[item]
trong khi self[item]
trỏ đến kết quả của type(self)
. Nhưng type(self)
sẽ trả về một cái gì đó như thế này: <class '__main__.AutoVivification'>
phải không? Tôi không có ý kiến gì về các dấu ngoặc tròn thêm ở cuối. Bởi vì tôi không biết làm thế nào chức năng được gọi là, tôi không hiểu nơi value
đang được trả lại.
Xin lỗi vì tất cả các câu hỏi! Có rất nhiều điều trong điều này mà tôi không hiểu và tôi không biết nơi để tìm kiếm nó lên ngắn đọc qua tài liệu cho giờ mà tôi muốn giữ lại rất ít. Mã này có vẻ như nó sẽ phục vụ cho mục đích của tôi nhưng tôi muốn hiểu nó trước khi sử dụng nó.
Trong trường hợp bạn muốn biết những gì tôi đang cố gắng thực hiện trong chương trình của mình với các từ điển lồng nhau: Tôi đang cố giữ dữ liệu bản đồ theo thang đo thiên văn. Mặc dù tôi không thể tạo từ điển/danh sách 10^6 mục được lồng 4 lần (có thể là 10^24 mục!), Khoảng trống hầu như trống nên tôi có thể để trống các giá trị trống và chỉ gán khi có thứ gì đó ở đó. Điều khiến tôi bối rối là một cách hiệu quả để xử lý các từ điển.