Fore и Python: дружба или просто интеграция

Филипп Пономарев
Денис Печёрин

Зачем производить интеграцию?

Не секрет, что начинающим разработчикам бывает трудно работать с Prognoz Platform, так как внутренний язык Fore имеет достаточно высокий порог вхождения. Чтобы уверенно использовать Fore, надо проходить дополнительные курсы или уметь хорошо работать на VBA, который по своей структуре похож на Fore, но эти знания не особо распространены среди разработчиков. Для того чтобы разработчикам было комфортно использовать решения, представленные как в Prognoz Platform, так и в других языках программирования в рамках одного проекта, необходимо реализовать интеграцию с существующими языками.

В первую очередь мы решили обратить внимание на такие языки, как Python и Java, потому что это одни из самых простых и распространенных языков.

Функциональность у них на уровне: Python располагает большим количеством библиотек абсолютно для любых целей. И если мы говорим о каких-то специфичных вещах, таких как Deep Machine Learning или работа с вычислениями, то на Python больше всего решений, потому что на нем такие вещи писать удобнее всего. Изначально целью этого языка было упростить работу с математическими задачами. Поэтому мы решили облегчить жизнь тем, кто использует Prognoz Platform для решения подобных задач, дать им возможность использовать Python в Fore.

Реализация

Начиная с версии Prognoz Platform 9.0, мы реализовали интеграцию с Python. Использовать Python нам хотелось в том числе и на реальных проектах, поэтому мы пообщались с нашими прикладными разработчиками, собрав предложения и пожелания по проектированию точек соприкосновения Fore и Python. И теперь наше решение позволяет использовать все типы, которые есть в Python, в том числе не только стандартные, но и написанные в Python классы. По архитектуре: появился Python-объект, это либо скалярный тип, либо специализированный тип, такой как лист, кортеж (tuple) или класс.

Что сделаем?

Предположим, у нас есть модуль на Python, который показывает нам стандартный MessageBox и содержит в себе сигнатуру класса «собака» (Dog), который содержит общие признаки собак, например, умение лаять и т.п. У собаки есть имя. Её можно обучить набору команд (лист), которые она сможет выполнять. Когда собака лает, на экране появляется MessageBox. Задача: надо написать на Fore модуль, чтобы он мог работать с этим Python-модулем.

Делаем…

Итак, у нас есть модуль на Python.

Ptest.py

В чем суть упрощения разработки? Мы сейчас написали Python-модуль, который хотим потом использовать. Например, у нас есть команда из программистов Python, которые могут создать полноценную систему. И в этой системе мы хотим использовать Fore. И нам уже не нужно множество разработчиков Fore, чтобы писать все с нуля, «переводя с Python на Fore». Нам нужен всего-навсего один специалист по Fore, который сможет нужными методами написать то, что уже сделали специалисты на Python. Это, безусловно, облегчит разработку.

А дальше поговорим о том, как это применять. Вернемся к нашему примеру. Напомню, что у нас есть Python-модуль, содержащий класс «собака». Как это использовать на Fore? Fore-модуль – обертка над этим классом «собака», в нем есть агрегация, которая держит PythonClassObject, и как раз здесь будет храниться Python-объект.

Что умеет этот модуль? Он умеет создавать собаку с определенным именем. У него есть функция: «Подать голос», которая заставляет собаку лаять, с подтверждением: смогла она «погавкать» или нет.

Есть функция обучения этой собаки.

Для работоспособности примеров необходимо указать ссылку в Fore на библиотеку: «Python».

Для начала «подключим» Python-модуль в Fore, укажем, где искать:

Давайте «заведём» и заставим лаять первую собаку:

Здесь мы видим несколько констант.

Первая константа : dog1 :PythonClassObject – так объявлен класс собаки. Название класса «собаки» в Python-модуле – dog. Имя модуля, в котором все располагается – Ptest. Название функции, когда собака «гавкает», – gav.

Обучим первую собаку командам через создание Python-списка из массива Fore:

Название функции обучения – studyfrom.

Можно продолжить обучение первой собаки через установку атрибута «commands» непосредственно из Fore, добавив:

Надо обратить внимание на функцию studyfrom2, потому что она обучает любую собаку по образцу другой собаки. В чем прелесть? Когда мы вызовем другую собаку, мы можем этот агрегированный объект просто передать, как параметр, и он автоматически все «кастит». Поэтому мы можем все что угодно бросать туда и обратно. И вот здесь он вызывает и обучает эту собаку:

Здесь получение списка команд и формочка, которая все это делает. Формочка создает собаку и заставляет собаку гавкать, создает собаку №2 и также заставляет ее гавкать, добавляет ей скиллы.

Вот код формочки - ничего особенного, просто вызывает ту обертку, в которой мы написали модуль:

Собственно, мы создали собаку. Она «гавкает» и говорит: «Я собака c таким-то именем», вызывается этот MessageBox уже из Python. Обучили собаку командам. Добавили ей команд через установку Python-свойства из Fore. Потом мы создали собаку №2. Обучили мы ее уже по образу первой собаки, передав класс в функцию как параметр.

Именованные параметры

Теперь поговорим про именованные параметры.

В Python есть такая возможность, как вызов функции с именованными параметрами. То есть у нас есть функция с параметрами, у каждого из которых свое имя и устанавливаемое значение по умолчанию. Если мы ничего не передаем, то берутся значения по умолчанию. Не обязательно передавать параметры в том порядке, в каком они объявлены, передавать параметры можно по имени, тем самым облегчая разработку.

Например, в Python-модуле есть функция: NamedParamsTest, где S1 – это STR1, S2 - STR2, S3 - STR3.

Когда мы ее вызываем без каких-либо параметров, то значения параметров устанавливаются в STR1, STR2, STR3 соответственно. Когда же мы ее вызываем с именованным параметром – то есть создаём объект Python, создаем именованный параметр, отправляем его при вызове, он автоматически заменяет именно тот параметр, что мы указали.

Заключение

Итак, давайте еще раз разберемся, зачем это сделано? Главным образом, для того чтобы использовать разработчиков Python и свести число разработчиков Fore к минимуму.

Ну, а если говорить о перспективах развития, то мы планируем добавить возможность подключать описание системных модулей Prognoz Platform в Python, чтобы сразу можно было использовать объекты платформы в среде Python.

Читайте также

Комментарии

Подробнее о политике использования персональных данных