Tôi có một mô-đun được chia nhỏ hơn một nửa giữa các chức năng loại tiện ích và chức năng lõi api. Tôi cần phải có tất cả chúng trong __all__
để có help()
hữu ích, và cũng để xác định cái nào trong số nhiều hàm/lớp/etc trong mô-đun để sử dụng bên ngoài, nhưng tôi cũng muốn hỗ trợ from mymodule import *
như một cách để có được chỉ là chức năng cốt lõi vào các mô-đun khác. Có cách nào làm được việc này không?Làm thế nào để xác định một `từ ... import * 'api riêng biệt từ __all__ trong một mô-đun?
Trả lời
Hầu như. Trong khi bạn không thể có __all__
làm nhiệm vụ tăng gấp đôi theo cách này, bạn có thể thêm mô-đun của riêng ảo api mà sau đó có thể được nhập khẩu ...
class fake_module(object):
def __init__(self, name, *args):
self.name = name
self.__all__ = []
all_objects = globals()
for name in args:
self.__dict__[name] = all_objects[name]
self.__all__.append(name)
def register(self):
sys.modules["%s.%s" % (__name__, self.name)] = self
fake_module('api', 'class1', 'class2', 'func3', 'exception4').register()
Sau đó, trong các module khác thay vì from mymodule import *
bạn có thể làm để from mymodule.api import *
chỉ nhận được tập hợp con mong muốn trong khi vẫn giữ mọi thứ trong một mô-đun duy nhất.
Note: from ... import *
không phải là thực hành thường tốt, và cần được sử dụng cẩn thận tuyệt vời và chỉ với modules/gói mà explicity nói rằng họ đã được thiết kế với việc sử dụng như vậy trong tâm trí.
Tôi không nghĩ rằng có một cách để làm điều đó - ít nhất không phải là một cách sạch sẽ. Ngay cả các mô-đun chính thức Python có rất nhiều hàm util xuất hiện trong tài liệu của nó. Những gì tôi sẽ làm, nếu sự tách biệt là quan trọng, là tạo ra hai mô-đun khác nhau. Dù sao, để sử dụng from module import *
không phải là một thực hành tốt và tôi sẽ không khuyên bạn nên làm điều đó, ít hơn nhiều để thiết kế mô-đun của bạn để phù hợp thực hành như vậy :)
Đối với mô-đun tiện ích do người dùng xác định, đó là thực tế khá tốt. – Evpok
@Evpok mô-đun tiện ích do người dùng xác định là gì? Các mô-đun có được sử dụng trong bảng điều khiển Python không? – brandizzi
Tôi có nghĩa là một số mô-đun có phím tắt hoặc hằng số được sử dụng ở mọi nơi trong ứng dụng, giá trị mặc định, số ma thuật, dấu gạch ngang bẩn ... – Evpok
Bạn không thể có những gì bạn muốn: import *
hành vi được xác định bởi __all__
.
Không chính xác những gì tôi muốn, nhưng khá darn gần. 'từ mymodule.api import *' là đủ tốt. –
Ethan, fake_module
của bạn có khả năng được thực hiện tốt hơn với trăn cũ đơn giản. Chỉ cần di chuyển mã của bạn vào thiết lập thư mục:
mymodule
__init__.py
api.py
util.py
_mymodule.py
Trường hợp _mymodule.py
chứa mã hiện tại của bạn.
Trong bạn __init__.py
:
from _mymodule import *
Trong bạn api.py
# explicity import only those api classes you want to expose
# this will allow you to call `from mymodule.api import *`
import from _mymodule ApiClass1
import from _mymodule ApiClass2
# etc
Làm tương tự cho bạn util.py
# explicity import only those util classes you want to expose
# this will allow you to call `from mymodule.util import *`
import from _mymodule UtilClass1
import from _mymodule UtilClass2
# etc
Vì vậy, bây giờ bạn có thể:
# import everything willy nilly for your help()
from mymodule import *
# or import only the "public" values from api and util
from mymodule.api import *
from mymodule.util import *
Tách mã của bạn như thế này có thể hữu ích cho việc tổ chức mô-đun lớn mà bạn vẫn muốn có thể truy cập từ một không gian tên cấp cao nhất. Nhưng tôi sẽ phải đồng ý với brandizzi
rằng việc sử dụng from mymodule import *
trong mã đang sử dụng mô-đun này thường là một ý tưởng tồi. Những gì bạn có được dễ dàng nhập khẩu bạn bị mất trong tính minh bạch của mã đang sử dụng những nhập khẩu đó.
Triệt để hoàn thành câu trả lời chi tiết cách thực hiện thông thường. –
- 1. Làm thế nào để import class từ gói mặc định
- 2. Làm thế nào để xác định một phương pháp riêng
- 3. chọn các mục riêng biệt từ một cột trong powershell
- 4. Làm cách nào để xác định các hằng số trong một tệp riêng biệt trong Perl?
- 5. 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__
- 6. Làm thế nào để xác định một lớp trong lớp riêng tư khác trong C++
- 7. Làm cách nào để xử lý tin nhắn cửa sổ từ một chuỗi riêng biệt?
- 8. Làm thế nào để lưu trữ một công cụ IronPython trong một AppDomain riêng biệt?
- 9. Làm thế nào để xác định xem một ngoại lệ là một loại đặc biệt
- 10. từ không gian được phân định riêng biệt trong một chuỗi
- 11. Làm thế nào để bạn thoát khỏi một từ dành riêng trong Delphi?
- 12. Làm thế nào để chạy một phương thức trong một AppDomain riêng biệt?
- 13. giới hạn từ khóa riêng biệt thành một cột
- 14. Làm thế nào để có được giá trị của một trường tĩnh riêng từ một lớp?
- 15. Làm thế nào để lặp qua một từ điển Python theo thứ tự được xác định?
- 16. Làm cách nào để xác định chính xác cách viết hoa chính xác cho một từ?
- 17. Làm cách nào để xác định xem một chuỗi không phải là cụm từ thông dụng?
- 18. Làm cách nào để chỉ nhận được một số từ được xác định từ một chuỗi trong php?
- 19. Scripting java: import class từ một tập tin bên ngoài
- 20. Làm thế nào để môđun hóa ứng dụng JSF/Facelets/Spring bằng OSGi?
- 21. Gọi một hàm trong một file riêng biệt trong Python
- 22. Làm thế nào để xác định tất cả các đoạn đường từ một danh sách các điểm được tạo ra từ một cử chỉ con chuột?
- 23. Làm thế nào để bắt đầu một hoạt động được xác định trong gói khác nhau từ một widget?
- 24. MFMailComposeViewController trong một lớp riêng biệt
- 25. Làm thế nào để bạn đăng một khác biệt lên ReviewBoard thông qua API của nó?
- 26. Câu riêng biệt cho một từ trên mỗi dòng
- 27. Làm thế nào để bỏ qua một cột để chọn riêng biệt trong postgresql?
- 28. Làm thế nào để vượt qua một biến TỪ TỪ TỪ một kịch bản lệnh shell?
- 29. ResourceDictionary trong một assembly riêng biệt
- 30. Làm thế nào để sử dụng Instrumentation.retransformClasses() một cách chính xác từ bên trong mã asm?
Không có nhu cầu thực sự để đi tất cả điên ở đây ... chỉ cần thực hiện một tập tin riêng biệt gọi là 'api' và nhập khẩu tập hợp con của các chức năng vào nó, và sau đó nhập khẩu nó vào __init__.py của mô-đun. – Dave
@Dave: mô-đun là các tệp đơn lẻ và do đó không có '__init __. Py's. gói là những cái mà * phải * có tệp '__init __. py' và có thể có các tệp khác. Thư viện tôi đang phát triển phù hợp thoải mái vào một tập tin duy nhất (có, tôi đã thử các tuyến đường gói cho nó, và cuối cùng chuyển trở lại một tập tin duy nhất/mô-đun bố trí). –
đủ công bằng. Khi bạn giả định ...:) – Dave