2011-07-06 30 views
12

Sau khi đọc this question, tôi nhận thấy rằng S. Lott có thể thích sử dụng “lệnh mặc định đã ra lệnh”, nhưng nó không tồn tại. Bây giờ, tôi tự hỏi: Tại sao chúng ta có quá nhiều lớp dict bằng Python?Tại sao Python không hợp nhất?

  • dict
  • blist.sorteddict
  • collections.OrderedDict
  • collections.defaultdict
  • weakref.WeakKeyDictionary
  • weakref.WeakValueDictionary
  • những người khác?

Tại sao không có một cái gì đó như thế này,

dict(initializer=[], sorted=False, ordered=False, default=None, 
    weak_keys=False, weak_values=False) 

rằng thống nhất tất cả mọi thứ, và cung cấp mọi sự kết hợp hữu ích?

+0

Sau đó, điều gì sẽ xảy ra khi bạn sử dụng 'a = {}'? – GWW

+2

'{}' có nên mặc định xây dựng một lệnh chính quy không? –

+0

Tôi nghĩ rằng anh ta có nghĩa là, để có được những hình thức khác của dict, chúng tôi sử dụng 'dict()' initialisation mà anh ta mô tả –

Trả lời

11

Một vấn đề là làm cho sự thay đổi này sẽ phá vỡ tính tương thích ngược, do đối với loại sử dụng hàm tạo này hiện tồn tại:

>>> dict(one=1, two=2) 
{'two': 2, 'one': 1} 
+0

Điểm tốt. Tôi quên mất điều đó. –

+0

Tôi không nghĩ đây là lý do chính đáng. Nếu có một lớp 'dict' duy nhất là một ý tưởng tốt ngoài khả năng tương thích ngược, nó sẽ được khắc phục cho Python 3. – RoundTower

7

Các tùy chọn bổ sung đó không được cung cấp miễn phí. Vì 99,9% Python được xây dựng trên dict, nó là rất quan trọng để làm cho nó tối thiểu và nhanh nhất có thể.

+1

Không thể '__new__' bị ghi đè sao cho hàm tạo' dict' trả về lớp 'dict' thông thường, trọng lượng nhẹ nếu tất cả các tùy chọn khác là' False'/'None'? –

+0

Tần suất các tùy chọn khác có khả năng * không * là 'Sai' /' Không có'? –

+1

Vấn đề là với một vấn đề như vấn đề được liên kết, đó là các kết hợp (như defaultdict theo thứ tự) mà bạn muốn không có sẵn. Ngoài ra, tôi không biết về tất cả những người khác khi tôi bắt đầu học Python, và họ có thể được khám phá nhiều hơn như các tùy chọn cho dict tiêu chuẩn hơn là giấu đi trong các thư viện mà tôi phải tìm hiểu. –

4

Do triển khai khác nhau rất nhiều. Về cơ bản bạn sẽ kết thúc với một nhà máy dict trả về một thể hiện của một _dict (Từ điển rất nhanh, chi phí thấp - hiện tại dict), ordereddict, defaultdict, ... lớp. Ngoài ra, bạn không thể khởi tạo từ điển với các đối số từ khóa nữa; các chương trình dựa vào điều này sẽ thất bại:

>>> dict(sorted=42) 
{'sorted': 42} 
# Your proposal would lead to an empty dictionary here (breaking compatibility) 

Bên cạnh đó, khi đó là hợp lý, các lớp khác nhau đã kế thừa từ nhau:

>>> collections.defaultdict.__bases__ 
(<type 'dict'>,) 
0

Đây là lý do ngôn ngữ có "kết hợp".

Bạn có thể thử phát minh ra điều gì đó tương tự như sau bằng cách xác định đúng nhóm lớp học.

class defaultdict(dict, unordered, default_init): pass 
class OrderedDict(dict, ordered, nodefault_init): pass 
class WeakKeyDict(dict, ordered, nodefault_init, weakkey): pass 
class KeyValueDict(dict, ordered, nodefault_init, weakvalue): pass 

Sau đó, khi bạn có những từ điển "thống nhất", các ứng dụng của bạn trông như thế này

groups= defaultdict(list) 

Không thay đổi thực sự để ứng dụng, phải không?

Các vấn đề liên quan