Tôi đang cố sử dụng một đối tượng làm khóa trong từ điển python, nhưng nó hoạt động theo cách mà tôi không thể hiểu được.đối tượng là các khóa trong từ điển python
Trước tiên tôi tạo ra một từ điển với đối tượng của tôi như là chìa khóa:
package_disseminators = {
ContentType("application", "zip", "http://other/property") : "one",
ContentType("application", "zip") : "two"
}
Bây giờ tạo một đối tượng đó là "giống" như một trong đó là chìa khóa.
content_type = ContentType("application", "zip", "http://other/property")
tôi đã đưa các đối tượng ContentType tùy chỉnh __eq__
và tùy chỉnh __str__
phương pháp, như vậy mà các phương pháp so sánh __eq__
__str__
giá trị.
Bây giờ, một số python tương tác:
>>> for key in package_disseminators:
... if key == content_type:
... print "match"
... else:
... print "no match"
...
no match
match
>>> content_type in package_disseminators.keys()
True
Ok, vì vậy nó trông giống như đối tượng của tôi là chắc chắn được xác định đúng như một chìa khóa, vì vậy:
>>> package_disseminators[content_type]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: (& (type="application/zip") (packaging="http://other/property"))
Er ... ok? Vì vậy content_type nằm trong danh sách package_disseminators.keys(), nhưng không phải là khóa?
>>> package_disseminators.has_key(content_type)
False
Dường như không.
Tôi đoán rằng quá trình so sánh mà Python sử dụng để xác định bình đẳng khác nhau giữa câu lệnh "trong" thẳng trên danh sách và thực sự tìm kiếm khóa trong dict, nhưng tôi không biết làm thế nào. Bất kỳ mẹo hoặc thông tin chi tiết nào?
Một số làm rõ thêm: Đối tượng của bạn đã có phương thức '__hash__' được thừa hưởng từ' đối tượng'. Nhưng việc thực hiện mặc định trả về một giá trị duy nhất cho mỗi cá thể, vì vậy hai cá thể bằng nhau sẽ có các hash khác nhau trừ khi bạn cung cấp một triển khai tốt hơn. 'has_key' so sánh giá trị băm,' in' kiểm tra tính bình đẳng, đó là lý do tại sao 'has_key' thất bại trong khi' in' thành công trong ví dụ của bạn. –
Xin chào các bạn. Tuyệt vời, cảm ơn vì điều này, được nhiều người đánh giá cao! –