Я создаю менеджер чат-ботов на Python, где я (или другие разработчики) могу предоставить файл конфигурации менеджеру, и он будет генерировать бота в зависимости от того, что он найдет в конфигурации.
Менеджер чат-бота обычно предназначен для мониторинга различных сервисов, а затем выполнения каких-либо действий в зависимости от того, что он обнаруживает во время мониторинга. В идеале у меня должно быть что-то вроде следующего:
[
{
triggerURL: "www.foobar.com/some/health/check",
triggerMethod: "GET"
healthyStatusCodes: [200, 202],
healthyResponseBody: "{\"status\":\"ok\"}",
healthyCallback: () => console.info("do something here"),
unhealthyCallback: () => console.info("do something else here")
}
]
Вы могли заметить, что мой пример немного похож на JS.
Есть ли способ встроить JavaScript в программу Python, чтобы выполнить то, что я хочу?
Есть ли другие альтернативы, которые делают что-то подобное? Я хотел бы свести к минимуму беспорядок в файле конфигурации и избежать необходимости писать будущим разработчикам дополнительный код, чтобы он работал.
Почему это JS-esque, а не Python-esque? Если вы создадите его на Python, вы можете использовать exec()
для его выполнения.
Я бы назвал это скорее плагином, чем файлом конфигурации, если вы можете включить произвольный исполняемый код.
возможно, сохраните его как обычный словарь Python - он также может хранить функции.
Самый простой — сохранить его как файл Python со словарем Python.
Он также может сохранять функции Python.
Вы можете назначить обратный вызов (имя функции без ()
) или использовать lambda
my_config.py
def other_function():
print("do something else here")
config = {
"triggerURL": "www.foobar.com/some/health/check",
"triggerMethod": "GET",
"healthyStatusCodes": [200, 202],
"healthyResponseBody": {"status": "ok"},
"healthyCallback": lambda: print("do something here"),
"unhealthyCallback": other_function,
}
И в основном коде вы можете сделать
import my_config
print(my_config.config["triggerURL"])
my_config.config["healthyCallback"]()
Вы также можете использовать модуль importlib для использования строк для импорта.
import importlib
my_config = importlib.import_module('my_config')
print(my_config.config["triggerURL"])
my_config.config["healthyCallback"]()
Если у вас есть файл в подпапке other/my_config.py
, вы можете использовать other.my_config
importlib.import_module('other.my_config')
Таким образом, вы можете использовать os.listdir()
, чтобы получить все файлы в папке или подпапке и импортировать их.
import importlib
import os
configs = {}
for name in os.listdir('other'):
if name.endswith('.py') and not name.startswith('_'): # skip __pycache__.py
name = name[:-3] # skip extension .py
configs[f'other.{name}'] = importlib.import_module(f'other.{name}')
# --- single config ---
print(configs['other.my_config'].config["triggerURL"])
configs['other.my_config'].config["healthyCallback"]()
# --- or all configs at once ---
for name in configs:
print('name:', name)
print(configs[name].config["triggerURL"])
configs[name].config["healthyCallback"]()
вы можете написать JS-интерпретатор на Python. Кажется, это хороший срочный проект, а не мгновенное решение.