2012-01-16 15 views
7

Đây là cấu trúc tập tin của tôi:Nhập một mô-đun tùy chọn

[mylibrary] 
    __init__.py 

    [codecs] 
     __init__.py < this is the file that we're talking about 
     optional.py 

Bây giờ tôi có mã này trong đánh dấu __init__.py:

def load_optional_codecs(): 
    try: 
     from mylibrary.codecs import optional 
     # do stuff with optional 
    except ImportError: 
     pass 

Có một vấn đề với điều này. Nếu mô-đun optional có chứa một ngoại lệ nhập, nó sẽ tự động không thành công. Có cách nào để nhập khẩu một mô-đun tùy chọn mà không im lặng bất kỳ ngoại lệ nào từ mô-đun không?


Điều này có vẻ như một trường hợp tối nghĩa, nhưng tôi đã gặp phải một lỗi khó chịu do ngoại lệ bị tắt tiếng và tôi muốn ngăn điều đó xảy ra trong tương lai.

+0

Bạn có thể báo cáo ngoại lệ cho người dùng hoặc ghi nhật ký thay vì 'pass' trong khối' except', nhưng nếu lỗi nhập không đưa ra lỗi khó chịu, tôi cho rằng gần như chắc chắn không phải là "tùy chọn". – geoffspear

+0

@Wooble: không, 'từ mylibrary.codecs nhập tùy chọn' không thành công. Vấn đề là module 'optional' đã nhập một module bị lỗi (do lỗi lập trình), nhưng lỗi đó đã bị tắt tiếng. – orlp

Trả lời

7

Đây là một chút hacky, nhưng bạn có thể kiểm tra các tin nhắn trên ngoại trừ để xác định những thất bại:

try: 
    from mylibrary.codecs import optional 
except ImportError, e: 
    if e.message != 'No module named optional': 
     raise 

Với mã này, nếu nhập khẩu các mô-đun tùy chọn thất bại, nó sẽ bị bỏ qua, nhưng nếu bất cứ điều gì khác đặt ra một ngoại lệ (nhập một mô-đun khác, các lỗi cú pháp, vv), nó sẽ được nâng lên.

+0

oh hah, điều đó khá tiện lợi. Nếu không có lựa chọn thay thế bật lên tôi nghĩ rằng tôi sẽ sử dụng này. – orlp

+0

Sẽ có một sự thay thế nếu các nhà thiết kế ngôn ngữ đã thêm một thuộc tính e. g. 'module' thành' ImportError'. Nhưng họ không làm như vậy, vì vậy đây có vẻ là cách khả thi nhất. – glglgl

+3

@glglgl 'ParsingError ('Thẻ bắt đầu của không tìm thấy')' – PascalVKooten

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