2013-04-10 8 views
6

Tôi đang tạo một bộ nguyên tắc mã hóa python cho một nhóm gồm ~ 30 nhà phát triển. Làm cơ sở cho tài liệu của tôi, cho đến nay tôi đã nghiên cứu Google python style guidePEP 8 style guide và kết hợp thông tin từ cả hai.Trong python, ưu điểm và nhược điểm của việc nhập một lớp so với nhập mô-đun của lớp là gì?

Một nơi hướng dẫn về phong cách của Google có nhiều hạn chế hơn PEP 8 là nhập. Hướng dẫn của Google yêu cầu các nhà phát triển chỉ nhập các gói và mô-đun và sau đó tham khảo các mục bên trong bằng một tên đủ điều kiện hơn. Ví dụ:

from pkg import module 
... 
my_class = module.MyClass() 

Lý do là "nguồn của mỗi số nhận dạng được biểu thị một cách nhất quán". Đối với dự án của chúng tôi, chúng tôi dự định tổ chức với các gói hai hoặc ba cấp độ sâu, do đó, để biết nguồn đầy đủ của số nhận dạng, người đọc có thể sẽ cần phải kiểm tra lại câu lệnh nhập. Tôi muốn ủng hộ phong cách này nhập khẩu như là một "phong cách ưa thích":

from pkg.module import MyClass 
... 
my_class = MyClass() 

IMHO, khả năng đọc trong cấu trúc python như comprehensions danh sách được cải thiện khi những cái tên ngắn gọn hơn.

Những gì tôi không rõ ràng là những gì trình thông dịch python có thể làm sau hậu trường. Ví dụ, bây giờ là MyClass một phần của không gian tên chung cho cả mô-đun này, và tất cả các nhà nhập khẩu của mô-đun này? (Điều này sẽ là xấu, có thể dẫn đến một số lỗi lạ, nếu điều này là đúng, tôi sẽ ủng hộ phong cách Google).

Trải nghiệm phát triển trăn của tôi bị giới hạn trong khoảng 6 tháng (và không có nhiều chuyên gia trong dự án của chúng tôi tham khảo ý kiến), vì vậy tôi muốn nhận thêm thông tin từ cộng đồng. Dưới đây là một số mặt hàng Tôi đã nghiên cứu đã:

effbot - discussion on imports

stack overflow - import vs. from import

python documentation - modules

python documentation - import

Cảm ơn bạn đã trả lời của bạn!

+3

* Mọi thứ * mà bạn có thể tham chiếu trực tiếp là toàn cầu trong mô-đun của bạn. 'MyClass' thực sự là một global trong ví dụ thứ hai của bạn, trong ví dụ đầu tiên,' module' là. –

+0

Tôi làm 'nhập blah' và' vlah = blah.vlah'. Bởi vì toàn bộ mô-đun 'blah' sẽ được xử lý dù sao nếu tôi đã làm' từ blah import vlah' – thkang

+0

Ngoài câu hỏi toàn cầu mà Martijn trả lời, bạn đang tìm kiếm cái gì đó khác. Nếu có, bạn có thể đặt câu hỏi rõ ràng hơn không? – msw

Trả lời

5

Trong Python, không có thứ gì như một biến toàn cầu trên nhiều mô-đun. Nếu bạn làm from pkg.module import MyClass thì MyClass nằm trong không gian tên chung của mô-đun nơi bạn làm điều đó, nhưng không phải bất kỳ mô-đun nào khác (bao gồm các mô-đun nhập mô-đun nhập MyClass).

Đối với câu hỏi chung chung hơn, cơ chế nhập có thể chấp nhận được tùy thuộc vào tình huống. Nếu tên mô-đun là dài, bạn có thể nhận được một số rút ngắn bằng cách nhập nó dưới một cái tên khác nhau:

# Awkward 
from package import reallylongmodule 
reallylongmodule.MyClass() 

# Less awkward 
from package import reallylongmodule as rlm 
rlm.MyClass() 

Nhập khẩu chỉ là lớp có thể sẽ ổn nếu tên lớp là đủ đặc biệt mà bạn có thể cho biết nơi nó xuất phát từ và nó là gì Tuy nhiên, nếu bạn có nhiều mô-đun xác định các lớp có tên tương đối không mô tả (ví dụ: "Bộ xử lý", "Đơn vị", "Dữ liệu", "Người quản lý"), thì có thể là một ý tưởng hay để truy cập chúng thông qua tên mô-đun để làm rõ Bạn đang làm gì vậy.

Hướng dẫn phong cách cuối cùng là hướng dẫn chứ không phải pháp luật. Sở thích của tôi là chọn một cơ chế tối đa hóa sự rõ ràng và dễ đọc. Điều đó liên quan đến sự cân bằng giữa việc tránh các tên dài và cồng kềnh, và cũng tránh các tên ngắn, mơ hồ hoặc bí ẩn.Cách bạn thực hiện sự cân bằng đó phụ thuộc vào các thư viện cụ thể bạn đang sử dụng và cách bạn đang sử dụng chúng (ví dụ: số lượng mô-đun bạn nhập, số lượng thứ bạn nhập từ chúng).

+0

Đồng ý! Tôi nghĩ rằng một trong hai phong cách là okay; chỉ lo lắng hơn là có những hàm ý tinh tế liên quan đến việc nhập khẩu một lớp (hoặc hàm) trực tiếp. – Tom

0

Tôi khuyên bạn nên sử dụng các trình kiểm tra mã tự động, như pylint, pep8, pyflakes, thay vì viết hướng dẫn mã.

Cá nhân tôi thích sử dụng from pkg import module, vì có thể xảy ra xung đột tên.

from package import module 

def my_fun(): 
    module.function() 

Trình thông dịch phải thực hiện 3 lần tra cứu bảng băm không gian tên cục bộ, không gian tên chung của mô-đun hiện tại và không gian tên của mô-đun đã nhập. Trong

from package.module import function 

def my_fun(): 
    function() 

nó sẽ chỉ thực hiện 2 lần tra cứu: lần tra cứu cuối cùng được thực hiện trong thời gian nhập.

+0

Tôi đồng ý về việc sử dụng mã kiểm tra tự động; yêu cầu có một tài liệu đến từ khách hàng của chúng tôi. Tôi có thể sẽ làm cho rằng một mục hướng dẫn mặc dù! – Tom