2014-04-09 16 views
5
pkg/ 
    __init__.py 
    foo.py 
    bar.py 
    baz.py 

Tôi có một loạt các nhập khẩu mô-đun giống nhau trên foo.py, bar.py và baz.py.Nhập qua gói python

Có cách nào tôi có thể thực hiện việc nhập trong __init__.py không? Tôi sẽ phải viết gì trong foo.py?

Trả lời

1

Đặt hàng nhập trong __init__.py sẽ là một ý tưởng tồi; __init__.py được sử dụng như nội dung của đối tượng mô-đun của bạn, do đó, nó là một giao diện công cộng. Ngoài ra, __init_.py được nhập ban đầu khi gói của bạn được nhập, trong khi bạn thực sự không cần nhập để xảy ra cho đến khi các mô-đun con của bạn cần chúng.

Cách tiếp cận tốt nhất là đặt mã phổ biến vào mô-đun chi tiết nội bộ, được đánh dấu bằng dấu gạch dưới ban đầu duy nhất (có nghĩa là "riêng tư"), ví dụ: _imports.py, sau đó trong các tệp khác của bạn viết from ._imports import *.

1

Bạn đoán đúng cách để làm điều này, nhưng tôi có thể làm cho điều này một chút chính thức hơn và cho (hy vọng) một lời giải thích rõ ràng hơn so với một trong những bạn tìm thấy ở nơi khác. Nếu bạn muốn mô đun hóa nhập khẩu, tùy thuộc vào triết lý mã hóa của bạn có thể là một ý tưởng tốt hay xấu (minh bạch và sử dụng lại mã), cho dù nhập khẩu có xảy ra trong __init__.py hay không, bạn có thể nhập khẩu từ một tập lệnh khác. Ví dụ:

"""import_scripts.py""" 
import numpy as np 
import scipy as sp 
... 

"""actual_code.py""" 
from import_scripts import * 
# np and sp are now in scope 

Nhập từ __init__.py chủ yếu là giống nhau, bạn chỉ cần theo truyền thống sử dụng một khẩu tương đối thay vì nếu bạn đang truy cập nó từ các mô-đun tương tự:

# To import form __init__ 
from . import * 

quan trọng cần lưu ý mặc dù, rằng các loại nhập khẩu này sẽ chỉ hoạt động nếu bạn chạy các kịch bản lệnh python này rõ ràng như các mô-đun chứ không phải là các tập lệnh. Điều này có nghĩa:

python -m foo 

thay vì

python foo.py 

quan trọng, nhưng tinh tế khác biệt.

Hy vọng điều đó sẽ hữu ích. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nhiều hơn nữa.

+0

+1 Cảm ơn sự khác biệt tinh tế! – ksindi