2010-03-25 27 views
6

Tôi có gói Python mymodule với gói phụ utils (ví dụ: thư mục con chứa các mô-đun có chức năng). Các hàm có cùng tên với tệp/mô-đun mà chúng đang hoạt động.Nhập hàm/lớp từ mô-đun Python có cùng tên

Tôi muốn để có thể truy cập vào các chức năng như sau,

from mymodule.utils import a_function

Kỳ lạ tuy nhiên, đôi khi tôi có thể nhập các chức năng sử dụng các ký hiệu trên, tuy nhiên thời điểm khác tôi không thể. Tôi đã không thể tìm ra lý do tại sao (ví dụ, gần đây tôi đổi tên một hàm và tệp trong đó và phản ánh việc đổi tên này trong tệp utils.__init__.py nhưng nó không còn được nhập dưới dạng hàm (thay vì mô-đun) trong một kịch bản của tôi.

các utils.__init__.py đọc một cái gì đó như thế nào,

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.py không có tham chiếu đến utils

Ý tưởng?

Trả lời

7

Do utils của bạn chức năng cần phải nhập các hàm utils khác? (hoặc nhập các mô-đun khác nhập các hàm utils khác). Giả sử ví dụ rằng a_function.py chứa chứa "từ mymodule.utils import b_function". Dưới đây là utils.py của bạn với một loạt các nhận xét bổ sung:

# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

Khi mô-đun đầu tiên được nhập bởi utils.py, utils.b_function là mô-đun không phải là chức năng. Bất kỳ mô-đun nào nêu "từ mymodule.utils import b_function" trước khi dòng cuối cùng được thực hiện sẽ kết thúc bằng tham chiếu đến mô-đun b_function thay vì hàm b_function.

Nói chung, tôi thấy rằng thành ngữ from somemodule import something là đầy nguy hiểm đối với bất kỳ dự án lớn nào. Nó rất tuyệt vời cho các tập lệnh ngắn, nhưng một khi bạn bắt đầu giới thiệu các phụ thuộc nhập khẩu vòng tròn bạn gặp phải các vấn đề và cần phải cẩn thận về nơi bạn sử dụng nó.

Như một sự thỏa hiệp giữa an toàn và tiết kiệm khi nhập, tôi sẽ sử dụng from mymodule import utils rồi gọi utils.a_function(). Bằng cách đó, bạn sẽ luôn nhận được đối tượng được liên kết với utils.a_functionngay bây giờ thay vì bất kỳ điều gì xảy ra bị ràng buộc với utils.a_function trong khi nhập.

+0

Vậy sự khác nhau giữa 'nhập mymodule.utils thành utils' và' từ mymodule import utils' là gì? –

+0

@Mike DeSimone: Điểm tốt. Tôi đã cập nhật câu trả lời của mình cho phù hợp. –

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