2015-11-21 13 views
10

Thỉnh thoảng, mọi người tham chiếu đến các đối tượng "giống X" bằng Python. Example:"Dict-like" có nghĩa là gì trong Python?

data_iter_maker - Đối số không thể gọi trả về một trình lặp trên đối tượng dữ liệu giống như dict.

Có phải "giống dict" có định nghĩa chính xác hay không và nếu có thì định nghĩa là gì? Nó có phải là một đối tượng x có thể được lập chỉ mục như một từ điển có thể: x[a], trong đó a là một hàm băm không? Trong trường hợp đó, một tên được đặt tên có thể không được coi là dict giống như, vì bạn không thể lập chỉ mục bằng cách sử dụng một biểu thức như x['a'] (cuối cùng tôi đã kiểm tra bạn phải viết x.a). Nhưng mặt khác, các tên gọi có chức năng tương tự như các dicts mà tôi không chắc nên nghĩ gì. Về mặt lý thuyết, tôi bị cám dỗ để đoán rằng "giống như dict" có nghĩa là "một đối tượng đủ tương tự để dict rằng mã của tôi sẽ tạo ra cùng một câu trả lời như thể bạn đã gửi một đối tượng dict tương đương ngữ nghĩa". Nói cách khác, "chạy hàm và tìm ra cho chính mình nếu đối số của bạn là giống như dict!"

Nói chung, là đối tượng giống như X thực hiện giao diện giống với X?

+10

* "Thông thường, là một đối tượng giống như X thực hiện giao diện giống như X?" * - vâng! Python thường sử dụng [gõ vịt] (https://docs.python.org/3/glossary.html#term-duck-typing). – jonrsharpe

+2

* "Nói cách khác," chạy hàm và tìm ra cho chính mình nếu đối số của bạn là giống như dict! "" * - Tôi mong chờ * "dict-like" * tương đương với * "thực hiện [' MutableMapping' interface] (https://docs.python.org/2/library/collections.html#collections-abstract-base-classes) "*. – jonrsharpe

+2

Không có gì hoài nghi về điều đó! Có một mô-đun hoàn toàn dành riêng cho việc lừa các chương trình python, kiểm tra [các lớp cơ sở trừu tượng] (https://docs.python.org/3.5/library/abc.html). – tdelaney

Trả lời

5

Python sử dụng 'duck-typing':

‘Nếu nó trông giống như một con vịt và quacks như một con vịt, nó phải là một con vịt.’

Hoặc có lẽ, "Nếu nó trông giống như một con vịt và quacks như một con vịt, nó là đủ gần với một con vịt để đối xử với nó như một. " Rõ ràng là âm thanh đầu tiên tốt hơn. Điều này liên quan chặt chẽ đến học thuyết python của "Easier to Ask for Forgiveness than to ask for Permission".

Một đối tượng dict nhưone which implements (or emulates) the dictionary interface. Các same concept often comes up for iterables, và thường trong numpy for 'array-like' (or 'array_like') objects.

+0

TIL: Trong liên kết https://docs.python.org/3/reference/datamodel.html#emulating-container-types được tham chiếu trong câu trả lời này, người ta nói rằng một _dict-like_ theo nghĩa hoàn toàn được gọi là a _mapping_. – clacke

+0

Điều này có vẻ giống như một bài tập học thuật. Tại sao bất cứ ai sử dụng một dict giống như không kế thừa từ dict? Ví dụ. 'defaultdict' kế thừa từ dict, cũng như' Counter'. Nhưng nếu chúng ta nhìn vào ví dụ [ChainMap] (https://docs.python.org/3.3/library/collections.html#chainmap-objects), nó kế thừa từ [Mapping] (https://docs.python.org/3.3/library/collections. abc.html # collections.abc.Mapping), nó không phải là một thể hiện của 'dict' và nó sẽ là hoàn toàn hợp lý để gửi một ChainMap nơi một dict được mong đợi. – clacke

5

thực tiễn gõ vịt:

dict_meths = set(dir({})) 

# Python3 
class A: 
    pass 

default_meths = set(dir(A())) 

diff = dict_meths - default_meths 

Bây giờ diff là:

{'__contains__', 
'__delitem__', 
'__getitem__', 
'__iter__', 
'__len__', 
'__setitem__', 
'clear', 
'copy', 
'fromkeys', 
'get', 
'items', 
'keys', 
'pop', 
'popitem', 
'setdefault', 
'update', 
'values'} 

Khi bạn thực hiện tất cả các phương pháp này trong lớp học của bạn, bạn chắc chắn có một đối tượng dict-như thế nào. Nếu một số ít phổ biến hơn như update bị thiếu, bạn vẫn có thể nói về một đối tượng giống như dict. So sánh file-like objects.