2009-02-23 5 views
5

Tôi có mô-đun nhập mô-đun, nhưng trong một số trường hợp, mô đun được nhập có thể không tồn tại. Sau khi mô-đun được nhập, có một lớp kế thừa từ một lớp mô-đun đã nhập. Nếu tôi bắt được ngoại lệ ImportError trong trường hợp mô-đun không tồn tại, làm thế nào tôi có thể ngăn không cho Python phân tích cú pháp phần còn lại của mô-đun? Tôi đang mở cho các giải pháp khác nếu điều đó là không thể.Làm cách nào để thoát khỏi mô-đun trước khi phân tích xong?

Dưới đây là một ví dụ cơ bản (selfaware.py):

try: 
    from skynet import SkyNet 
except ImportError: 
    class SelfAwareSkyNet(): 
     pass 
    exit_module_parsing_here() 

class SelfAwareSkyNet(SkyNet): 
    pass 

Cách duy nhất tôi có thể nghĩ đến để làm điều này là:

  • Trước khi nhập các module selfaware.py, kiểm tra xem các mô-đun skynet có sẵn và chỉ cần chuyển hoặc tạo một lớp sơ khai. Điều này sẽ gây ra DRY nếu selfaware.py được nhập nhiều lần.
  • Trong vòng selfaware.py có lớp được xác định bằng khối try. ví dụ .:

    try: 
        from skynet import SkyNet 
        class SelfAwareSkyNet(SkyNet): 
         pass 
    except ImportError: 
        class SelfAwareSkyNet(): 
         pass 
    
+0

Có gì sai với giải pháp của bạn? Nó có hoạt động không? Nó có lỗi không? –

+0

Có tiếng vọng ở đây không ?? Có gì với tất cả các câu trả lời trùng lặp chính xác? Và tại sao cả hai bản sao mới hơn có điểm số cao hơn so với cũ? –

+0

@MuMind Tôi đoán tôi đã không nhận thấy câu trả lời của hyperboreean đã được chỉnh sửa sau khi ban đầu nó không chính xác. Tôi đã phản ứng lại câu trả lời. –

Trả lời

2

Bạn có thể sử dụng:

try: 
    from skynet import SkyNet 
    inherit_from = SkyNet 
except ImportError: 
    inherit_from = object 

class SelfAwareSkyeNet(inherit_from): 
    pass 

này chỉ hoạt động nếu thực hiện không khác nhau.

Chỉnh sửa: Giải pháp mới sau khi nhận xét.

8

thử: hỗ trợ một khác: khoản

try: 
    from skynet import SkyNet 

except ImportError: 
    class SelfAwareSkyNet(): 
     pass 

else: 
    class SelfAwareSkyNet(SkyNet): 
     pass