2010-09-23 29 views
56

Tôi nhận thấy điều gì đó kỳ lạ hôm nay tôi muốn giải thích. Tôi đã không chắc chắn 100% làm thế nào để thậm chí cụm từ này như là một câu hỏi, do đó, google là ra khỏi câu hỏi. Mô-đun ghi nhật ký không có quyền truy cập vào mô-đun logging.handlers vì một số lý do kỳ lạ. Hãy tự mình thử nếu bạn không tin tôi:Tại sao các mô-đun Python đôi khi không nhập mô-đun phụ của chúng?

>>> import logging 
>>> logging.handlers 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'handlers' 
>>> import logging.handlers 
>>> logging.handlers 
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'> 

Có thể giải thích tại sao điều này xảy ra không?

Trả lời

73

Trong Python, các mô-đun cần được nhập trước khi chúng có thể truy cập được. import logging chỉ nhập mô-đun đăng nhập. Điều đó xảy ra là logging là gói có các mô-đun con, nhưng các mô-đun con đó vẫn không được tải tự động. Vì vậy, bạn cần nhập rõ ràng logging.handlers trước khi bạn có thể truy cập.

Nếu bạn tự hỏi tại sao đôi khi bạn không cần nhập thêm: một số gói nhập một số hoặc tất cả các mô-đun con của chúng khi chúng được nhập - chỉ đơn giản bằng cách nhập các tệp đó trong các tệp __init__.py của chúng. Trong các trường hợp khác, có thể là một thứ khác mà bạn nhập, cũng đã nhập logging.handlers. Nó không quan trọng mà đoạn mã nào nhập khẩu; miễn là một cái gì đó trong quá trình nhập của bạn logging.handlers trước khi bạn truy cập vào nó, nó sẽ ở đó. Và đôi khi một mô-đun trông giống như một gói thực sự không phải là một gói, như là osos.path. os không phải là một gói, nó chỉ cần nhập đúng mô-đun khác (cho nền tảng của bạn) và gọi nó là path, chỉ để bạn có thể truy cập nó dưới dạng os.path.

3

Tôi cũng mới đến python và sau khi có rất nhiều thực tế bây giờ tôi có thể phân biệt giữa, gói (thư mục), mô-đun (py), các lớp học, các biến ... vv ...

nếu bạn muốn bất kỳ thư mục nào của bạn là gói python - Nó phải chứa __init__.py tệp thậm chí tệp rỗng sẽ làm !!!

và như Thomas đã nói, bạn có thể nhập thêm mô-đun trong __init__.p y nếu bạn muốn !!! nhưng modules/gói có thể truy cập chỉ sau khi nhập nó ...

nếu bạn muốn nhập tất cả mọi thứ từ một mô-đun bạn có thể sử dụng

from logging import * 

còn lại bạn có thể truy cập vào bộ xử lý mô-đun như dưới đây cũng vậy,

from loggin import handlers 
print dir(handlers) 
+3

Vui lòng không sử dụng 'từ nhập mô-đun *'. Nó gần như luôn luôn là một sai lầm. –

+0

Nếu bạn muốn mọi thứ trong một gói được nhập tự động, hãy thực hiện nhập khẩu đó trong __init__.py, thay vì đặt __all__ trong __init__.py và thực hiện 'từ gói nhập *' ở đâu đó. –

+0

có, bạn đã đúng! – shahjapan

1

Tôi đã gặp phải tình huống tương tự gần đây. Vì vậy, tôi đặt cược bạn đã xóa một số phần nhập lib của bên thứ ba. Đã xóa lib đó chứa from logging import handlers hoặc from logging import * và cung cấp cho bạn handlers. Và trong kịch bản khác, bạn đã có một cái gì đó giống như import logging và chỉ sử dụng logging.handlers và bạn đã nghĩ rằng đó là cách mọi thứ hoạt động như tôi đã làm.

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