Импорт функций

Узнайте, как импортировать функции из других плагинов, написанных на разных языках, и использовать их в своем собственном.

В Plugify языковой модуль Python позволяет импортировать и использовать функции из плагинов, написанных на других языках. Это достигается за счет генерируемых во время выполнения синтетических модулей, которые обеспечивают бесшовное межплагиновое взаимодействие. Кроме того, могут быть сгенерированы stub-файлы (.pyi), чтобы предоставить подсказки типов и сигнатуры функций для лучшего опыта разработки в IDE, таких как PyCharm или VSCode.

Это руководство объясняет, как импортировать функции в Python и как использовать stub-файлы для разработки.

Обзор

При импорте функций из другого плагина в Python:

  1. Генерируемые во время выполнения модули: Plugify динамически генерирует синтетические модули во время выполнения, позволяя вам напрямую импортировать и вызывать функции из других плагинов.
  2. Stub-файлы для разработки: Stub-файлы (.pyi) могут быть сгенерированы для предоставления подсказок типов и сигнатур функций. Эти файлы не требуются для выполнения во время выполнения, но полезны для разработки.
  3. Прямые вызовы функций: Функции вызываются напрямую с использованием импортированных синтетических модулей.

Импорт функций в Python

Импортируйте синтетические модули

Чтобы импортировать функции из другого плагина, используйте систему импорта Plugify для загрузки синтетического модуля для целевого плагина.

plugin.py
import sys
from plugify.plugin import Plugin, Vector2, Vector3, Vector4, Matrix4x4
from plugify.pps import plugin_from_another_language as other_plugin
  • plugin_from_another_language: Замените это на имя плагина, из которого вы хотите импортировать функции.
  • other_plugin: Это псевдоним для импортированного модуля плагина.

Вызовите импортированные функции

После импорта синтетического модуля вы можете вызывать его функции напрямую.

Пример 1: Вызов простой функции

plugin.py
def some_function():
    # Call a function from the imported plugin
    other_plugin.ParamCallback(
        111, 
        2.2, 
        5.1234, 
        Vector4(-125.1, -225.2, -325.3, -425.4), 
        [60000000, -700000000, 80000000000], 
        'D', 
        'pink metal', 
        'Y', 
        -100
    )
  • ParamCallback: Это пример функции, экспортируемой целевым плагином. Замените его на фактическое имя функции.
  • Параметры: Передайте необходимые параметры в соответствии с сигнатурой функции.

Пример 2: Вызов функции с параметром обратного вызова

Если импортируемая функция требует обратный вызов (callback) в качестве параметра, вы можете определить обратный вызов в Python и передать его в функцию. Вот пример:

plugin.py
class CallbackHolder:
    @staticmethod
    def mock_func(u32, v3, u_vec):
        # Modify the parameters (passed by reference)
        u32 = 42
        v3 = Vector3(1.0, 2.0, 3.0)
        u_vec = [1, 2, 3]
        # Return the modified values in a tuple
        return None, u32, v3, u_vec

def func_call():
    # Call the imported function with the callback
    result = other_plugin.CallFuncCallback(CallbackHolder.mock_func)
    return result
  • CallFuncCallback: Это пример функции, которая принимает обратный вызов в качестве параметра.
  • mock_func: Это функция обратного вызова, определенная в Python. Она изменяет параметры, переданные по ссылке, и возвращает их в виде кортежа.
  • Возвращаемые значения: Функция обратного вызова возвращает None (для типа возвращаемого значения void) и измененные параметры.

Использование stub-файлов для разработки

Stub-файлы (.pyi) не требуются для выполнения во время выполнения, но настоятельно рекомендуются для разработки. Они предоставляют подсказки типов и сигнатуры функций, что облегчает понимание доступных функций и их параметров.

Генерация stub-файлов

Plugify предоставляет скрипт generator.py для автоматической генерации stub-файлов для импортируемых плагинов.

Найдите скрипт-генератор:

  • Скрипт generator.py находится в папке generator языкового модуля Python.

Запустите скрипт-генератор:

  • Откройте терминал или командную строку и перейдите в папку, содержащую generator.py.
  • Запустите скрипт со следующей командой:
    python generator.py "path_to_plugin.pplugin" "output_folder"
    
    • path_to_plugin.pplugin: Путь к файлу манифеста плагина (.pplugin), из которого вы хотите импортировать функции.
    • output_folder: Каталог, в который будет сохранен сгенерированный stub-файл.

Пример:

python generator.py ./plugins/MyPlugin/MyPlugin.pplugin ./stubs/

Сгенерированный stub-файл:

  • Скрипт сгенерирует stub-файл (например, MyPlugin.pyi) в указанной папке вывода.
  • Пример содержимого stub-файла:
    MyPlugin.pyi
    from collections.abc import Callable
    from enum import IntEnum
    from plugify.plugin import Vector2, Vector3, Vector4, Matrix4x4
    
    # Generated from plugin_from_another_language.pplugin by https://github.com/untrustedmodders/plugify-module-python3.12/blob/main/generator/generator.py
    
    def ParamCallback(a: int, b: float, c: float, d: Vector4, e: list[int], f: str, g: str, h: str, k: int) -> None:
        ...
    

Использование stub-файлов в вашей IDE:

  • Поместите сгенерированный stub-файл (.pyi) в каталог вашего проекта (но не в папку с плагинами).
  • IDE, такие как PyCharm и VSCode, будут использовать stub-файл для предоставления подсказок типов и автодополнения.

Поддержка stub-файлов в PyCharm:

Поддержка stub-файлов в VSCode:

  • VSCode поддерживает stub-файлы путем настройки параметра python.analysis.stubPath в ваших рабочих или пользовательских настройках. Добавьте путь к папке, содержащей ваши stub-файлы (например, ./stubs/), чтобы включить подсказки типов и автодополнение.
  • Пример конфигурации settings.json:
    {
      "python.analysis.stubPath": "./stubs"
    }
    

Примечания

  • Stub-файлы необязательны: Stub-файлы предназначены только для разработки и не должны включаться в папку выполнения вашего плагина.
  • Эффективность во время выполнения: Поскольку Python является динамически типизированным языком, вызовы функций разрешаются во время выполнения без необходимости в предварительно скомпилированных заголовочных файлах или stub-файлах.

Следуя этому руководству, вы можете легко импортировать и использовать функции из других плагинов в вашем плагине на Python, используя при этом stub-файлы для лучшего опыта разработки.