Tôi đang làm việc trên một dự án có nguyên tắc hướng dẫn thiết kế chính là khả năng mở rộng.Làm cách nào để sắp xếp cấu trúc tệp của hệ thống plugin đã hoạt động của tôi?
Tôi đã triển khai hệ thống plugin bằng cách xác định metaclass đăng ký - với phương thức lớp - tên lớp của bất kỳ plugin nào được tải (mỗi loại plugin kế thừa từ một lớp cụ thể được xác định trong mã lõi). là các loại plugin khác nhau trong ứng dụng). Về cơ bản điều này có nghĩa rằng một nhà phát triển sẽ phải xác định đẳng cấp của mình như
class PieChart(ChartPluginAncestor):
# Duck typing:
# Implement compulsory methods for Plugins
# extending Chart functionality
và chương trình chính sẽ biết sự hiện diện của mình bởi vì PieChart
sẽ được đưa vào danh sách các plugin đã đăng ký có sẵn tại ChartPluginAncestor.plugins
.
Là phương pháp gắn kết một phương thức lớp, tất cả các plugin được đăng ký khi mã lớp của chúng được tải vào bộ nhớ (vì vậy ngay cả trước khi đối tượng của lớp đó được khởi tạo).
Hệ thống hoạt động đủ ™ tốt cho tôi (mặc dù tôi luôn luôn mở để gợi ý về cách cải thiện kiến trúc!) Nhưng bây giờ tôi tự hỏi điều gì sẽ là cách tốt nhất để quản lý các tập tin plugin (tức là nơi và cách các tệp chứa các plugin phải được lưu trữ).
Cho đến nay tôi đang sử dụng - cho mục đích phát triển - một gói mà tôi gọi là "plugin". Tôi đặt tất cả các tệp * .py chứa các lớp bổ trợ trong thư mục gói và tôi chỉ phát hành import plugins
trong tệp main.py, để tất cả các plugin được gắn đúng cách.
EDIT: Jeff đã chỉ ra trong các ý kiến rằng import plugins
các lớp có trong các mô-đun khác nhau của gói sẽ không có sẵn (tôi không nhận ra điều này như tôi đã - cho mục đích gỡ lỗi - nhập từng lớp riêng biệt với from plugins.myAI import AI
).
Tuy nhiên hệ thống này chỉ tốt trong khi tôi đang phát triển và thử nghiệm mã, như:
- Plugins có thể đi kèm với unittests riêng của họ, và tôi không muốn tải những trong bộ nhớ.
- Tất cả các plugin hiện được tải vào bộ nhớ, nhưng thực sự có một số plugin là phiên bản thay thế của cùng một tính năng, vì vậy bạn chỉ cần biết rằng bạn có thể chuyển đổi giữa hai plugin, nhưng bạn chỉ muốn tải vào bộ nhớ một trong những bạn đã chọn từ cửa sổ cấu hình.
- Tại một thời điểm nào đó, tôi sẽ muốn có vị trí kép để cài đặt plugin: vị trí trên toàn hệ thống (ví dụ: một nơi nào đó dưới
/usr/local/bin/
) và một người dùng cụ thể (ví dụ: ở đâu đó theo số/home/<user>/.myprogram/
).
Vì vậy, câu hỏi của tôi là thực sự - có lẽ - ba: container
- Plugin: lựa chọn hợp lý nhất là những gì cho mục tiêu của tôi? các tệp đơn lẻ? gói? một thư mục đơn giản của các tệp .py?)
- Nhận biết sự hiện diện của các trình cắm mà không nhất thiết phải tải (nhập) chúng: cách thông minh để sử dụng tính năng intropection của Python là gì?
- Đặt plugin ở hai vị trí khác nhau: có cách nào/cách thực hành tốt nhất (dưới gnu/linux, ít nhất) để làm điều đó không?
Tôi nghĩ rằng 'các plugin nhập 'sẽ chỉ tải gói và không phải mô-đun trong gói. –
Đây là gợi ý tôi đang tìm kiếm! :) – mac