2012-01-01 65 views
28

Có một điều mà tôi không hiểu.Tại sao AttributeError này trong python xảy ra?

Tại sao thực hiện điều này

import scipy # happens with several other modules, too. I took scipy as an example now... 

matrix = scipy.sparse.coo_matrix(some_params) 

sản phẩm lỗi này:

AttributeError: 'module' object has no attribute 'sparse' 
+3

Điều gì khiến bạn khó chịu về điều đó? Bạn mong đợi điều gì sẽ xảy ra nếu 'sparse' không tồn tại trong module? –

+1

Tôi đã không nhận ra rằng, thưa thớt là một * submodule * của scipy, và submodules là *** không ** nhập khẩu tự động * - như @ David Zaslavsky chỉ ra dưới đây. – Aufwind

+11

downvoters nên giải thích lý do tại sao họ downvoted, tôi không thấy những gì sai với câu hỏi này. Trong thực tế, tôi nghĩ rằng đó là một câu hỏi rất hay – juliomalegria

Trả lời

41

Điều này xảy ra bởi vì các mô-đun scipy không có bất kỳ thuộc tính tên sparse. Thuộc tính đó chỉ được xác định khi bạn import scipy.sparse.

Mô-đun con không tự động được nhập khi bạn chỉ import scipy; bạn cần phải nhập chúng một cách rõ ràng. Điều tương tự cũng được giữ cho hầu hết các gói, mặc dù một gói có thể chọn nhập các mô-đun con riêng của nó nếu muốn. (Ví dụ, nếu scipy/__init__.py bao gồm một tuyên bố import scipy.sparse, sau đó các submodule sparse sẽ được nhập khẩu bất cứ khi nào bạn nhập scipy.)

+1

Tôi không biết, các mô-đun con không tự động được nhập. Cảm ơn! – Aufwind

+0

Nó thực sự phụ thuộc vào gói cho dù submodules được tự động nhập khẩu là tốt. –

+0

@Ethan: true, tôi đã chỉnh sửa ghi chú cho hiệu ứng đó vào câu trả lời. –

3

Bởi vì bạn nhập scipy, không thưa thớt. Hãy thử from scipy import sparse?

1

AttributeError được nâng lên khi thuộc tính của đối tượng không khả dụng.

Một attribute reference là một chính tiếp theo là một khoảng thời gian và tên:

attributeref ::= primary "." identifier

Để trả về một danh sách các thuộc tính hợp lệ cho đối tượng đó, sử dụng dir(), ví dụ:

dir(scipy) 

Vì vậy, có thể là bạn cần phải làm một cách đơn giản: import scipy.sparse

-1

Không gian tên mặc định bằng Python là "__main__". Khi bạn sử dụng import scipy, Python sẽ tạo một không gian tên riêng biệt làm tên mô đun của bạn. Quy tắc trong Pyhton là: khi bạn muốn gọi thuộc tính từ một không gian tên khác, bạn phải sử dụng tên thuộc tính đủ điều kiện.

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