У меня есть словарь, содержащий ссылки на разные функции. Я пытался сделать свой код более читабельным и упростить добавление функций в этот словарь. Я пытался преобразовать свой словарь в файл .json, но он выдает ошибку при попытке добавить функцию.
Это упрощенная версия моего кода:
import json
def func1(): print("func1")
def func2(): print("func2")
def func3(): print("func3")
testDict = {
"value1":[func1, "test1"],
"value3":[func2, "test2"],
"value3":[func3, "test3"],
}
with open("test.json", "w") as fw:
json.dump(testDict, fw, indent=2)
Это код, который я сделал для чтения файла .json:
with open("test.json", "r+") as fr:
testDict2 = json.load(fr)
Однако, когда я пытаюсь создать файл, он останавливается, как только достигает ссылки на первую функцию:
{
"value1": [
Как это исправить и возможно ли вообще?
Функция представляет собой объект, специфичный для python, поэтому кодировать его в json не имеет смысла. Если вы измените это на "value1":["func1", "test1"],
, где функция упоминается как строка, то она может быть jsonified, НО тогда вам нужно eval()
, которая приглашает большой риск.
Я хочу упростить добавление дополнительных функций в мой словарь, вместо того, чтобы искать словарь в моем коде, я могу просто добавить его в файл .json.
Но вам все равно нужно определить эту функцию в скрипте, что противоречит цели
Ну да, но это больше для удобства чтения, вместо случайного словаря в моем коде у меня есть отдельный файл для этого материала.
Вы смотрели на исключение, возникшее в этот момент? «Ошибка типа: объект функции типа не сериализуем JSON»
Да, это была проблема, которая теперь исправлена просто превращением ее в строку, но теперь мне нужен способ вызова функций.
Согласно: https://www.w3schools.com/js/js_json_datatypes.asp «В JSON значения должны быть одного из следующих типов данных:
Значения JSON не можешь относятся к одному из следующих типов данных:
Место функций Python находится в файлах .py, потому что именно там они имеют какое-то значение. JSON должен быть независимым от языка
Нет, прямо не возможно. Формат JSON не предоставляет средств для сериализации функций. Потенциально вы могли бы сделать это, используя модуль inspect
, чтобы получить источник строки функции, а затем eval
, но во многих случаях это все равно не будет работать правильно, например, когда у вас есть захваченная ссылка на переменную в охватывающей области в ваша функция.
Стоит отметить, что в целом попытки выполнить сериализованный код представляют собой множество рисков для безопасности. Во многих приложениях ввод данных в формате JSON предоставляется пользователем. Разрешение пользователю предоставлять функции в качестве входных данных создает уязвимость выполнения произвольного кода.
globals()"funcName" работает
Какова ваша цель сбросить
function
как json?