2014-08-31 16 views
8

Nhìn vào source code, có vẻ như "lý do" duy nhất là OrderedDict được viết bằng Python, trong khi defaultdict ở C. Nhưng có vẻ như điều này đang thay đổi khi Python 3.5 cần có cOrderedDict (xem Python Bugs). lời giải thích duy nhất của tôi thực sự là.Tại sao OrderedDict được đặt tên trong trường hợp lạc đà trong khi defaultdict thấp hơn?

Có ai có thể cung cấp giải thích tốt hơn không? Tôi hy vọng có một lý do chính đáng hơn là.

Sửa: Câu trả lời alleged duplicate là OK cho Python 2.7, không cho Python 3 nơi sự phân biệt đẳng cấp/loại đã biến mất. OrderedDictdefaultdict là cả hai lớp xem xét bởi các thông dịch viên riêng của mình:

>>> collections.defaultdict 
<class 'collections.defaultdict'> 
>>> collections.OrderedDict 
<class 'collections.OrderedDict'> 
+1

"Giờ đây các lớp và loại được cho là thống nhất, sự khác biệt giữa CamelCase đối với các lớp Python và chữ thường cho các kiểu C là bực bội khó xử." - user2357112, từ nhận xét trong bản sao được đánh dấu. – user2864740

+0

Giải quyết điểm "này đang thay đổi": đó không phải là cách triển khai python 3 c. Ví dụ py3, bạn làm 'import pickle' và đại biểu này để' import _pickle' - triển khai c - nếu có. – roippi

+0

Cảm ơn, @roippi, tôi đã đề cập đến các bản vá lỗi trong được gọi là 'cOrderedDict'. Thực tế là cả hai phiên bản C và Python sẽ được nhập thông qua cùng tên là không liên quan. Các quy ước đặt tên cho 'defaultdict' và' OrderedDict' vẫn không khớp. –

Trả lời

11

Dựa trên những gì tôi có thể tìm thấy trên các tài liệu lưu trữ python-dev, đây chỉ là một trường hợp của các nhà phát triển không tuân theo hướng dẫn riêng của họ.

Guido thực sự gợi ý renaming defaultdict to DefaultDict để sửa chữa sự mâu thuẫn này trong cuộc thảo luận của PEP mà giới thiệu OrderedDict:

Dù sao, có vẻ như các mô-đun bộ sưu tập đặc biệt đã là nội bộ mâu thuẫn - NamedTuple vs defaultdict. Theo một nghĩa nào đó, defaultdict là phiên bản lẻ ở đây vì đây là những thứ bạn nhập từ một số mô-đun, chúng không được tích hợp sẵn. Có thể đổi tên thành NamedDict?

Lưu ý rằng NamedDict là một typo, he meant DefaultDict:

> Tôi giả sử bạn có nghĩa là "DefaultDict".

Vâng, tôi đã bị phân tâm. :-(

Tôi không chắc chắn lý do tại sao sự thay đổi này (và những thay đổi tương tự cho các module khác, ví dụ như socket.socket, datetime.datetime) không bao giờ được thực hiện, kể từ khi Guido hỗ trợ làm việc đó.

Trớ trêu thay, (hoặc có thể Alex Martelli), người đã đưa ra với tên defaultdict, mặc dù thực tế rằng họ đã dựa trên một lớp học nội Google đã sử dụng gọi DefaultDict:

Google có một kiểu dữ liệu nội bộ gọi là DefaultDict mà được 012.351.đã vượt qua giá trị mặc định khi xây dựng. Phương pháp __getitem__ của nó, thay vì tăng KeyError, chèn một bản sao nông (!) Của giá trị mặc định cho vào dict khi không tìm thấy giá trị.

... snip ...

Over ăn trưa với Alex Martelli, ông đề nghị rằng một lớp con của dict với hành vi này (nhưng thực hiện trong C) sẽ là một bổ sung tốt cho ngôn ngữ. Có vẻ như sẽ không khó để thực hiện.Có thể là nội trang dựng sẵn có tên defaultdict. Đối số đầu tiên, bắt buộc, đối với hàm tạo phải là giá trị mặc định. Các đối số còn lại (ngay cả từ khóa args) được chuyển không đổi cho hàm tạo dict.

thảo luận một cách nhanh chóng chuyển từ defaultdict là một built-in để nó là một phần của mô-đun collections, nhưng tên toàn chữ thường bị mắc kẹt. Cuộc thảo luận này đã diễn ra vào năm 2006, do đó, PEP 8 đã tồn tại trong nhiều năm sau đó. Không chắc chắn lý do tại sao nó không bao giờ xảy ra với bất cứ ai mà nó nên được đặt tên DefaultDict vào thời điểm đó.

+0

Tôi khá chắc chắn loại nội bộ của Google đã được triển khai bằng Python, vì vậy nó sẽ sử dụng quy ước đặt tên Python. – user2357112

+3

@ user2357112 Trong cùng một chuỗi nơi 'OrderedDict' đang được thảo luận, [Guido đã nói điều này] (https://mail.python.org/pipermail/python-dev/2009-March/086639.html) để đáp lại đề xuất tương tự (mà các lớp được thực hiện trong C nên được đặt tên trong tất cả chữ thường): * "Sau đó, tất cả chúng đều sai. Trong 3.0 chúng ta đang di chuyển khỏi điều này, ví dụ: cPickle đã biến mất, vì vậy là cStringIO. ** Ngôn ngữ thực hiện nên không chiếu qua **. \ * Có thể \ * "trạng thái tích hợp" nên hướng dẫn cách viết hoa , vì vậy chỉ các loại được tích hợp là chữ thường (str, int, dict v.v.). "* – dano

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