2014-04-03 16 views
5

Khi tôi cố gắng sử dụng pyplot từ matplotlib:phần chênh lệch giữa nhập khẩu python sub-module từ NumPy, gói matplotlib là những gì

import matplotlib 
print matplotlib.pyplot # just checking 

Nó mang lại cho tôi AttributeError: 'module' object has no attribute 'pyplot'

Nó có thể được giải quyết với:

import matplotlib.pyplot 

Nhưng những gì tôi thực sự nhầm lẫn là,

import numpy 
print numpy.random 

mang lại cho tôi <module 'numpy.random' from '/Applications/Canopy.app/appdata/canopy-1.0.3.1262.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages/numpy/random/__init__.pyc'>

sự khác biệt giữa hai trường hợp là gì? Không thể gọi số pyplot trong ví dụ đầu tiên, nhưng random là số thứ hai. Tôi nghĩ rằng nó có liên quan với một số loại gói và mô-đun. Nhưng tôi không phải là một chuyên gia như vậy với python, do đó yêu cầu một câu trả lời.

Trả lời

4

Để biết hướng dẫn dứt khoát, read this.

Nhưng đối với trường hợp cụ thể của bạn, có vẻ như đây là những gì đang xảy ra:

Mỗi mô-đun python dựa trên thư mục (như matplotlibnumpy) có một tập tin __init__.py, mà quyết định những gì được đưa vào cấp cao nhất của mô-đun phạm vi. Theo mặc định (khi __init__.py trống), không có gì nằm trong phạm vi.

Tuy nhiên, một số mô-đun (như numpy) đã quyết định đưa chức năng vào cấp cao nhất bằng cách thêm các câu lệnh nhập vào __init__.py. Điều này làm cho các mô-đun con trở thành phạm vi, ngay cả khi bạn chỉ nhập rõ ràng numpy.

Để kiểm tra các giả định của chúng tôi, hãy nhìn vào nguồn!

+0

Đây là một câu trả lời tuyệt vời! –

0

Dường như trong __init__.py của một module, nó có thể sử dụng một biến __all__ để kiểm soát những gì biến hoặc các chức năng được nhập khẩu trong phạm vi hiện tại khi bạn viết một tuyên bố như sau: from modulename import *; Tôi nghĩ rằng nó cũng làm việc cho các cú pháp import modulename; Trong tập tin __init__.py của NumPy, tôi thấy đoạn mã sau:

__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma']) 
+0

Biến '__all__' chỉ ảnh hưởng đến nhập sao: http://stackoverflow.com/a/64130/10601 – perimosocordiae

+0

Cảm ơn bạn rất nhiều, tôi nghĩ rằng tôi hiểu sự khác biệt bây giờ – zhujs

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