Quy ước đặt tên trong Python cho các mô-đun


102

Tôi có một mô-đun có mục đích là xác định một lớp được gọi là "nib". (và một số lớp liên quan nữa.) Tôi nên gọi chính mô-đun như thế nào? "ngòi"? "nibmodule"? Còn gì nữa không?

Câu trả lời:


110

Chỉ cần ngòi. Đặt tên lớp là Nib, viết hoa N. Để biết thêm về quy ước đặt tên và các lời khuyên về kiểu khác, hãy xem PEP 8 , hướng dẫn về kiểu Python.


2
Hầu hết các dự án Python có tuân theo quy ước này không? Bởi vì tôi nhận thấy được xây dựng trong lớp học nằm trong chữ thường, ví dụ như danh sách, chuỗi vv
Ram Rachum

4
Bạn quan sát wrt các kiểu dựng sẵn là đúng. Tuy nhiên, đây là những trường hợp ngoại lệ. Hầu hết các lớp khác được định nghĩa trong thư viện chuẩn đều được viết hoa.
Stephan202

2
Tôi nghĩ đây là quy ước chính xác, nhưng có một vấn đề cố hữu với nó, ít nhất là với tôi. Giả sử tôi có một lớp được gọi Client, và dễ hiểu là tôi thường tạo các phiên bản của nó mà tôi muốn gọi client. Nhưng theo quy ước của bạn, tên mô-đun sẽ là client, và vì vậy tôi luôn phải đặt tên cho các phiên bản của mình một cái gì đó không tự nhiên client_instance. Bạn nghĩ gì về vấn đề này?
Ray

3
@Ray Nhưng giả sử quy ước là đặt tên cho mô-đun Client, thì nó sẽ xung đột với tên lớp Client. Vì chỉ có 3 khả năng đặt tên biến thể ( client, Clienthoặc CLIENT) có sẽ luôn có một cuộc đụng độ giữa hai trong số các trường hợp, các lớp học, mô-đun hoặc hằng số. Tôi tin rằng có ít lần bạn đặt tên mô-đun của mình giống với một thể hiện hoặc hằng số hơn so với lớp, và do đó là quy ước đặt tên tốt hơn cho các khả năng khác. Nó cũng sẽ làm cho việc nhập từ các mô-đun dễ đọc hơn vì bạn thường nhập các lớp và hằng hơn là các biến.
Ted Klein Bergman,

2
Lý do tại sao nội trang là chữ thường là ngụ ý rằng chúng được triển khai bằng C chứ không phải là python.
Har

41

Tôi sẽ gọi nó là nib.py. Và tôi cũng sẽ đặt tên cho lớp là Nib.

Trong một dự án python lớn hơn mà tôi đang thực hiện, chúng tôi có rất nhiều mô-đun xác định về cơ bản một lớp quan trọng. Các lớp được đặt tên bắt đầu bằng một chữ cái viết hoa. Các mô-đun được đặt tên giống như lớp bằng chữ thường. Điều này dẫn đến nhập khẩu như sau:

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

Nó hơi giống như mô phỏng theo cách Java. Một lớp cho mỗi tệp. Nhưng với sự linh hoạt được bổ sung, bạn luôn có thể thêm một lớp khác vào một tệp duy nhất nếu nó phù hợp.


27

Tôi biết giải pháp của tôi không phổ biến lắm theo quan điểm của pythonic, nhưng tôi thích sử dụng cách tiếp cận Java của một mô-đun-> một lớp, với mô-đun được đặt tên là lớp. Tôi hiểu lý do đằng sau kiểu python, nhưng tôi không quá thích có một tệp rất lớn chứa rất nhiều lớp. Tôi cảm thấy khó duyệt, mặc dù gấp.

Một lý do khác là kiểm soát phiên bản: có một tệp lớn có nghĩa là các cam kết của bạn có xu hướng tập trung vào tệp đó. Điều này có thể dẫn đến một số lượng lớn các xung đột cần được giải quyết. Bạn cũng mất thông tin nhật ký bổ sung mà cam kết của bạn sửa đổi các tệp cụ thể (do đó liên quan đến các lớp cụ thể). Thay vào đó, bạn thấy một sửa đổi đối với tệp mô-đun, chỉ với nhận xét cam kết để hiểu sửa đổi nào đã được thực hiện.

Tóm lại, nếu bạn thích triết lý python, hãy xem các đề xuất của các bài viết khác. Thay vào đó, nếu bạn thích triết lý giống java, hãy tạo một Nib.py chứa lớp Nib.


1
Các vấn đề được đề cập là do các hạn chế trong trình chỉnh sửa và việc sử dụng các công cụ kiểm soát phiên bản, không phải do ngôn ngữ hoặc phong cách lập trình. Một lớp cho mỗi tệp là bất lợi cho cấu trúc mã. Sử dụng spyderhoặc một trình chỉnh sửa tương tự để xem tóm tắt các lớp của bạn nhằm hỗ trợ điều hướng và hai ngăn có cùng tệp mở trên cả hai. Ngoài ra, vui lòng đọc PEP8. Python là để viết Python và Java cho Java, nhưng Python không phải để viết Java.
Ioannis Filippidis

5
@IoannisFilippidis: Nếu tôi phải đặt tất cả các lớp cho một mô-đun trong một tệp duy nhất ở kích thước mã mà tôi thường quản lý, tôi thậm chí sẽ không thể mở tệp, va chạm với các đồng nghiệp khác sẽ tăng vọt và sếp của tôi sẽ phỉ báng tôi khuôn mặt (nghĩa bóng là vậy) vì đã đề xuất nó. Một cách tiếp cận tệp duy nhất không mở rộng quy mô, PEP-8 hay không.
Stefano Borini

2
@StefanoBorini: PEP8 không yêu cầu một cách tiếp cận tệp duy nhất. Một lớp cho mỗi mô-đun và một tệp cho mỗi (đơn vị mã) là hai cực của một phổ rất rộng. Nếu bạn thấy kích thước tệp lớn không thể quản lý với một tệp cho mỗi mô-đun, bạn có lẽ nên xem xét sửa đổi cách tiếp cận của mình để chia nhỏ một gói thành các mô-đun.
Chintalagiri Shashank

22

ngòi ổn. Nếu nghi ngờ, hãy tham khảo hướng dẫn kiểu Python.

Từ PEP 8 :

Tên gói và tên mô-đun Mô-đun phải có tên ngắn, toàn chữ thường. Dấu gạch dưới có thể được sử dụng trong tên mô-đun nếu nó cải thiện khả năng đọc. Các gói Python cũng nên có tên ngắn, toàn chữ thường, mặc dù không khuyến khích sử dụng dấu gạch dưới.

Vì tên mô-đun được ánh xạ tới tên tệp và một số hệ thống tệp không phân biệt chữ hoa chữ thường và cắt ngắn các tên dài, điều quan trọng là tên mô-đun phải được chọn khá ngắn - đây sẽ không phải là vấn đề trên Unix, nhưng nó có thể là một sự cố khi mã được chuyển đến các phiên bản Mac hoặc Windows cũ hơn hoặc DOS.

Khi mô-đun mở rộng được viết bằng C hoặc C ++ có mô-đun Python đi kèm cung cấp giao diện cấp cao hơn (ví dụ: hướng đối tượng hơn), mô-đun C / C ++ có dấu gạch dưới ở đầu (ví dụ: _socket).


1
uhm ... cái này đập vào bụng tôi. Tôi đang sử dụng tiền tố gạch dưới trong các gói / mô-đun cho một cái gì đó hoàn toàn khác (dự định tham chiếu monty python).
Stefano Borini

0

Từ PEP-8: Tên gói và mô-đun :

Mô-đun phải có tên ngắn, toàn chữ thường. Dấu gạch dưới có thể được sử dụng trong tên mô-đun nếu nó cải thiện khả năng đọc.

Các gói Python cũng nên có tên ngắn, toàn chữ thường, mặc dù không khuyến khích sử dụng dấu gạch dưới.

Khi mô-đun mở rộng được viết bằng C hoặc C ++ có mô-đun Python đi kèm cung cấp giao diện cấp cao hơn (ví dụ: hướng đối tượng hơn), mô-đun C / C ++ có dấu gạch dưới ở đầu (ví dụ: _socket).


-3

mô-đun foo trong python sẽ tương đương với tệp lớp Foo trong Java

hoặc là

mô-đun foobar trong python sẽ tương đương với tệp lớp FooBar trong Java

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.