2009-12-01 26 views
5

Giả sử bạn có sauTự nhập gói phụ hay không?

b 
b/__init__.py 
b/c 
b/c/__init__.py 
b/c/d 
b/c/d/__init__.py 

Trong một số gói python, nếu bạn import b, bạn chỉ nhận được những biểu tượng quy định tại b. Để truy cập vào b.c, bạn phải rõ ràng import b.c hoặc from b import c. Nói cách khác, bạn phải

import b 
import b.c 
import b.c.d 
print b.c.d 

Trong các trường hợp khác, tôi đã thấy nhập tự động tất cả các gói phụ. Điều này có nghĩa là mã sau không xuất hiện lỗi

import b 
print b.c.d 

b/__init__.py sẽ chăm sóc nhập gói con của nó. Tôi có xu hướng thích cái đầu tiên (rõ ràng tốt hơn là ngầm), và tôi luôn sử dụng nó, nhưng có trường hợp thứ hai nào được ưu tiên hơn không?

Trả lời

5

Tôi thích không gian tên - vì vậy tôi nghĩ rằng import b chỉ nên nhận nội dung trong số b chính nó (có lẽ là trong b/__init__.py). Nếu có lý do để tách biệt chức năng khác trong b.c, b.c.d hoặc bất kỳ điều gì, thì chỉ cần import b không được kéo tất cả - nếu "kéo tất cả" vào, tôi nghĩ rằng việc tách không gian tên có thể là không có thật một để bắt đầu. Tất nhiên, có những ví dụ ngay cả trong thư viện chuẩn (import os, sau đó bạn có thể sử dụng os.path.join và các loại tương tự), nhưng chúng cổ xưa, bây giờ về cơ bản là "ông nội" mọi thứ từ trước khi hệ thống đóng gói Python đã trưởng thành và ổn định. Trong mã mới, tôi muốn mạnh mẽ đề nghị rằng một gói nên không kéo các gói phụ của nó đi cùng cho chuyến đi khi bạn nhập. (Do import this tại dấu nhắc Python và chiêm ngưỡng dòng cuối cùng nó hiển thị ;-).

0

__all__ = [bạn vars, chức năng, các lớp học]

Sử dụng cú pháp trên trong gói b của __init__.py để tự động điều tải liệt kê trong dict. :)

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