2010-04-26 39 views
38

Có quy ước đặt tên gói cho Python như Java của com.company.actualpackage không? Hầu hết thời gian tôi thấy các tên gói đơn giản, có khả năng va chạm như "web".Quy ước tên gói Python

Nếu không có quy ước như vậy, có lý do gì không? Bạn nghĩ gì khi sử dụng quy ước đặt tên Java trong thế giới Python?

Trả lời

35

Python có hai "thần chú" mà bao gồm chủ đề này:

Explicit là tốt hơn so với tiềm ẩn.

Namespaces là một ý tưởng tuyệt vời honking - hãy làm nhiều hơn nữa của những người!

Có quy ước đặt tên và nhập mô-đun có thể được tìm thấy trong The Python Style Guide (PEP 8).

Lý do lớn nhất là không có quy ước như vậy để luôn đặt tiền tố cho tên mô-đun của bạn theo kiểu Java, bởi vì theo thời gian bạn kết thúc với rất nhiều sự lặp lại trong mã của bạn không thực sự cần ở đó.

Một trong những vấn đề với Java là nó buộc bạn phải lặp lại chính mình, liên tục. Có rất nhiều mẫu soạn thảo đi vào mã Java mà không cần thiết trong Python. (Getters/setters là một ví dụ điển hình về điều đó.)

Không gian tên không quá khó khăn trong Python vì bạn có thể cung cấp cho mô-đun một bí danh khi nhập. Chẳng hạn như:

import com.company.actualpackage as shortername 

Vì vậy, bạn không chỉ có thể tạo hoặc thao tác không gian tên trong các chương trình của mình, mà còn có thể tạo bí danh tiết kiệm phím của riêng bạn.

+4

+1 cho bí danh với từ khóa 'as' – n611x007

1

Tôi đã sử dụng python trong nhiều năm và 99,9% các vụ va chạm mà tôi đã thấy comer từ các nhà phát triển mới đang cố gắng đặt tên cho tệp là "xml.py". Tôi có thể thấy một số lợi thế đối với lược đồ Java, nhưng hầu hết các nhà phát triển đều đủ thông minh để chọn các tên gói hợp lý, vì vậy nó thực sự không phải là vấn đề lớn.

+0

Sự cố "xml.py" (đặt tên tập lệnh vô tình làm đổ bóng mô-đun dựng sẵn) được gây ra bởi tập lệnh là mô-đun * và * thư mục của tập lệnh được tìm kiếm mô-đun, không phải tên rõ ràng. Những người đặt tên cho tập lệnh 'xml.py' của họ thường không mong đợi nó được nhập bằng 'import xml'. –

+1

Nhà phát triển có kinh nghiệm sẽ không đặt tên cho tập lệnh 'xml.py' và mong muốn thực hiện 'nhập xml', nhưng tôi đã tuyên bố rõ ràng đây là sự cố đối với nhà phát triển mới. – mikerobi

5

Lý do thường không có phân cấp gói là vì gói Python không dễ dàng mở rộng theo cách đó. Các gói là các thư mục thực, và mặc dù bạn có thể làm cho các gói tìm trong nhiều thư mục cho các mô-đun phụ (bằng cách thêm các thư mục vào danh sách gói __path__) nó không thuận tiện và dễ dàng thực hiện sai. Đối với lý do tại sao Gói Python không dễ dàng mở rộng theo cách đó, tốt, đó là một lựa chọn thiết kế. Guido không thích các hệ thống phân cấp sâu (và vẫn không) và không nghĩ chúng là cần thiết.

Quy ước là chọn một tên gói to lớn, rõ ràng nhưng độc đáo đối với dự án của bạn - ví dụ: tên của dự án. Bạn có thể cấu trúc mọi thứ bên trong nó, tuy nhiên bạn muốn (bởi vì bạn nắm quyền kiểm soát nó.) Chia gói thành các bit riêng biệt với các chủ sở hữu riêng biệt là một ít công việc hơn, nhưng với một vài hướng dẫn có thể. Nó hiếm khi cần thiết.

13

Các quy ước của Java cũng có những hạn chế riêng. Không phải mọi gói mở đều có một trang web ổn định phía sau nó. Người bảo trì nên làm gì nếu trang web của anh ấy thay đổi? Ngoài ra, việc sử dụng tên gói lược đồ này trở nên dài và khó nhớ. Cuối cùng, tên của gói phải đại diện cho mục đích của gói, không phải là chủ sở hữu của gói đó, chứ không phải chủ sở hữu của nó là

+0

+1 hoàn toàn đồng ý –

+0

Lý do sử dụng tên miền là sử dụng không gian tên dưới sự kiểm soát của chủ dự án. Nhưng nó sẽ gây nhầm lẫn nếu trang web khác với tên gói ... – deamon

+1

@deamon Vấn đề trong câu trả lời là bạn sẽ làm gì nếu bạn không có tên miền mà bạn kiểm soát - điều này đúng với nhiều cá nhân – Mark

7

Không có quy ước đặt tên giống như Java cho gói Python. Bạn có thể áp dụng một gói cho bất kỳ gói nào bạn tự phát triển, nhưng bạn có thể phải chỉnh sửa bất kỳ gói nào bạn có thể áp dụng từ bên thứ ba và quy ước đặt tên "văn hóa ngoài hành tinh" có thể sẽ thay đổi các gói của riêng bạn bên ngoài tổ chức của bạn. Về mặt kỹ thuật, sẽ không có gì sai với quy ước của Java bằng Python (nó sẽ chỉ làm cho một số tuyên bố from dài hơn một chút, không có vấn đề lớn), nhưng trong thực tế các khía cạnh văn hóa làm cho nó không khả thi lắm.

3

Không có gì ngăn cản bạn bằng cách sử dụng quy ước đó nếu bạn muốn, nhưng nó không phải ở tất cả các tiêu chuẩn trong thế giới Python và bạn có thể sẽ có ngoại hình hài hước. Sẽ không có gì thú vị khi chăm sóc quản trị trên các gói khi chúng được lồng sâu trong com.

Nó nghe có vẻ cẩu thả đối với người đến từ Java, nhưng thực tế nó dường như không gây ra bất kỳ khó khăn lớn nào, ngay cả với các gói có tên kém như web.py.

Nơi bạn thường làm xung đột get namespace trong thực tế là hàng nhập khẩu tương đối: nơi mã trong package.module1 cố gắng để import module2 và có cả một package.module2 và một module2 trong thư viện chuẩn (trong đó có thường được như stdlib lớn Và phát triển). May mắn thay, nhập khẩu tương đối mơ hồ are going away.

+1

Ehm, rất khó để thực hiện nhập khẩu tuyệt đối thay vì nhập tương đối do tai nạn, xem xét nhập khẩu tuyệt đối phải được bật một cách rõ ràng. Các vấn đề phổ biến là cách khác vòng: cố gắng để nhập khẩu một mô-đun stdlib từ một gói có một mô-đun có cùng tên. Nó không phải do thiếu phân cấp gói (vì bạn đang ở trong một gói ngay tại đó) nhưng việc nhập khẩu tương đối tiềm ẩn mà Python loại bỏ trong 3.x. –

+0

Ah, vâng, đồng ý ... viết lại. – bobince

2

Bản cập nhật cho bất kỳ ai khác đi kèm tìm kiếm này:

Tính đến năm 2012, PEP 423 địa chỉ này. PEP 8 chạm vào chủ đề một thời gian ngắn, nhưng chỉ để nói: tất cả chữ thường hoặc dấu gạch dưới.

Ý chính của nó: chọn những tên đáng nhớ, có ý nghĩa chưa được sử dụng trên PyPI.