Tôi đang xây dựng một nền tảng rất cơ bản dưới dạng mô-đun Python 2.7. Mô-đun này có vòng lặp đọc-eval-in trong đó các lệnh người dùng đã nhập được ánh xạ tới các cuộc gọi chức năng. Vì tôi đang cố gắng làm cho nó dễ dàng để xây dựng các mô-đun plugin cho nền tảng của tôi, các cuộc gọi chức năng sẽ từ mô-đun chính của tôi đến một mô-đun plugin tùy ý. Tôi muốn một trình xây dựng plugin có thể chỉ định lệnh mà anh ta muốn kích hoạt chức năng của mình, vì vậy tôi đã tìm kiếm một cách Pythonic để nhập từ xa một ánh xạ trong lệnh-> function dict trong module Chính từ mô-đun plugin.Hầu hết các cách Pythonic để cung cấp siêu dữ liệu chức năng tại thời gian biên dịch?
tôi đã xem xét một vài điều:
Phương pháp phân tích cú pháp tên: module chính sẽ nhập khẩu các module cắm và quét nó cho tên phương pháp phù hợp với một định dạng nhất định. Đối với ví dụ , có thể thêm phương thức download_file_command (tệp) vào phương thức dict là "tệp tải xuống" -> download_file_command. Tuy nhiên, việc nhận được một tên lệnh ngắn gọn, dễ gõ (ví dụ: "dl") yêu cầu tên của hàm cũng ngắn, điều này không tốt cho mã khả năng đọc. Nó cũng yêu cầu nhà phát triển plugin phải tuân theo định dạng đặt tên chính xác .
Cross-mô-đun trang trí: trang trí sẽ cho phép các nhà phát triển Plugin tên chức năng của mình bất cứ điều gì ông muốn và chỉ cần thêm một cái gì đó như @ Main.register ("dl"), nhưng họ sẽ thiết yêu cầu tôi đều sửa đổi không gian tên của mô-đun khác và giữ trạng thái toàn cầu trong mô-đun chính là . Tôi hiểu điều này rất tệ.
Cùng module trang trí: sử dụng logic tương tự như trên, tôi có thể thêm một trang trí có thêm tên của chức năng đối với một số lệnh name> chức năng lập bản đồ địa phương để các mô-đun plugin và lấy ánh xạ đến Mô-đun chính có cuộc gọi API . Điều này đòi hỏi phải có một số phương thức nhất định hoặc mặc dù được thừa hưởng và - nếu sự hiểu biết của tôi về trang trí là chính xác - chức năng sẽ chỉ đăng ký lần đầu tiên nó chạy và sẽ không cần đăng ký lại sau mỗi lần sau đó.
Vì vậy, những gì tôi thực sự cần là cách Pythonic để chú thích hàm có tên lệnh sẽ kích hoạt hàm và cách đó không thể là tên của hàm. Tôi cần phải có khả năng trích xuất lệnh tên-> ánh xạ hàm khi tôi nhập mô-đun và mọi công việc ít hơn ở phía nhà phát triển plugin là một điểm cộng lớn.
Cảm ơn sự giúp đỡ, và lời xin lỗi của tôi nếu có bất kỳ sai sót nào trong sự hiểu biết Python của tôi; Tôi tương đối mới với ngôn ngữ.
Chỉ cần kiểm tra bạn nhận ra điều này, nhưng trang trí (và chức năng định nghĩa) thực hiện tại thời gian chạy, điều duy nhất Python thực hiện tại thời gian biên dịch là biên dịch mã của bạn. – Duncan
Không có gì sai cả với phương pháp 2. Yêu cầu họ làm điều gì đó như 'import plugin' và làm' @ plugin.register ('my_method_name') \ ndef somefunc_meeting_an_api_spec(): ... ' –
Bạn có thể muốn xem xét cách [plac] (http://pypi.python.org/pypi/plac) thực hiện điều đó. – georg