2013-03-20 19 views
6

Hãy xem xét kịch bản sau đây:Làm thế nào để ngăn chặn người dùng từ nhập khẩu x từ một submodule khi nó tiếp xúc trong phụ huynh sử dụng __all__

  • Bạn có một mô-đun M quy định tại m.py chứa một hàm f.

    Nó có thể được gọi là như thế này:

    import M; 
    M.f() 
    
  • Module phát triển đến một kích thước mà nó là không thực tế để có trong một tập tin duy nhất. Bạn chia M thành submodules M.X, M.Y, M.Z và đặt sau đây trong M/__init__.py:

    from .X import * 
    from .Y import * 
    from .Z import * 
    
    __all__ = ["f"] 
    

    Mã ban đầu vẫn hoạt động:

    import M; 
    M.f() 
    

Tuy nhiên, người tiêu dùng mới của mã có thể nhầm lẫn truy cập trực tiếp vào mô-đun con:

import M.X; 
M.X.f() 

Tôi muốn ngăn chặn điều này, sao cho tất cả mã vẫn liên tục giải quyết M trực tiếp và không phải bất kỳ mô-đun con nào.

Các mô-đun con là vì lợi ích của tổ chức mã nội bộ và tham chiếu M để lại khả năng sắp xếp lại dễ dàng trong tương lai.

Một tùy chọn sẽ là đặt tên các mô-đun con _X, _Y_Z để thông báo rằng chúng là nội bộ. Đó có phải là cách tiếp cận được khuyến nghị không?

+4

Bạn không thích. Tại sao lại là một vấn đề? Mô-đun của bạn vẫn hoạt động, mã sử dụng các mục đó vẫn hoạt động. –

+0

Tôi muốn ngăn chặn điều này, sao cho tất cả mã vẫn liên tục giải quyết M trực tiếp chứ không phải bất kỳ mô-đun con nào. Các mô-đun con là vì lợi ích của tổ chức mã nội bộ, và tham chiếu M bỏ khả năng sắp xếp lại dễ dàng trong tương lai. (Câu hỏi được chỉnh sửa để bao gồm chi tiết này.) –

+3

tài liệu đúng cách để làm điều đó và tin tưởng người dùng của bạn sẽ đủ thông minh để làm theo lời khuyên của bạn –

Trả lời

1

Một tùy chọn sẽ là đặt tên các mô-đun con _X, _Y và _Z để thông báo rằng chúng là nội bộ. Đó có phải là cách tiếp cận được khuyến nghị không?

Vì bạn không muốn mọi người truy cập M.X, bạn sẽ cần di chuyển mô-đun X.py để không còn có sẵn như M.X. Bạn có thể xóa nó như Kaie gợi ý, nhưng ugh. Do đó có, đề xuất của bạn là phương pháp được đề xuất.

  1. Move M/X.py để M/_X.py

  2. Trong M/__init__.py có dòng from ._X import f

Như những người khác đã gợi ý, nó không nên thực sự là một vấn đề mà mọi người có thể truy cập vào mã và nó thói quen lập trình bằng ngôn ngữ có khả năng đóng gói mạnh mẽ hơn vào các thiết kế Python của bạn.

Các mô-đun con là vì lợi ích của tổ chức mã nội bộ và tham chiếu M bỏ khả năng sắp xếp lại dễ dàng trong tương lai.

Có điều này là một mối lo ngại mà tôi có khi đến từ C và C++ và giao dịch với ABIs cả ngày. Nhưng nó thường không phải là một vấn đề nếu mã là nhỏ và cũng được thử nghiệm đủ. Và đây là thứ mà bạn có thể sửa chữa sau này. Nếu một ngày nào đó bạn quyết định tổ chức lại mã để có X_X thì tôi chắc chắn Jenkins có thể cho bạn biết cần phải cập nhật những gì khác. :)

0

Có một cách, nhưng tôi không nghĩ rằng bạn sẽ thích nó:

# M/__init__.py 

from .X import * 
del X 
__all__ = ["x"] 

Bạn vẫn có thể làm import M.X, nhưng sẽ ném báo lỗi khi sử dụng nó.

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