Как добавить ссылку на функцию python в файл json

У меня есть словарь, содержащий ссылки на разные функции. Я пытался сделать свой код более читабельным и упростить добавление функций в этот словарь. Я пытался преобразовать свой словарь в файл .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": [

Как это исправить и возможно ли вообще?

Какова ваша цель сбросить function как json?

JayPeerachai 18.03.2022 17:53

Функция представляет собой объект, специфичный для python, поэтому кодировать его в json не имеет смысла. Если вы измените это на "value1":["func1", "test1"],, где функция упоминается как строка, то она может быть jsonified, НО тогда вам нужно eval(), которая приглашает большой риск.

JNevill 18.03.2022 17:54

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

poendie 18.03.2022 17:56

Но вам все равно нужно определить эту функцию в скрипте, что противоречит цели

matszwecja 18.03.2022 17:58

Ну да, но это больше для удобства чтения, вместо случайного словаря в моем коде у меня есть отдельный файл для этого материала.

poendie 18.03.2022 18:15

Вы смотрели на исключение, возникшее в этот момент? «Ошибка типа: объект функции типа не сериализуем JSON»

chepner 20.03.2022 16:31

Да, это была проблема, которая теперь исправлена ​​​​просто превращением ее в строку, но теперь мне нужен способ вызова функций.

poendie 21.03.2022 12:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
38
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Согласно: https://www.w3schools.com/js/js_json_datatypes.asp «В JSON значения должны быть одного из следующих типов данных:

  • строка
  • число
  • объект (объект JSON)
  • массив
  • логическое значение
  • нулевой

Значения JSON не можешь относятся к одному из следующих типов данных:

  • функция
  • свидание
  • неопределенный"

Место функций Python находится в файлах .py, потому что именно там они имеют какое-то значение. JSON должен быть независимым от языка

Ответ принят как подходящий

Нет, прямо не возможно. Формат JSON не предоставляет средств для сериализации функций. Потенциально вы могли бы сделать это, используя модуль inspect, чтобы получить источник строки функции, а затем eval, но во многих случаях это все равно не будет работать правильно, например, когда у вас есть захваченная ссылка на переменную в охватывающей области в ваша функция.

Стоит отметить, что в целом попытки выполнить сериализованный код представляют собой множество рисков для безопасности. Во многих приложениях ввод данных в формате JSON предоставляется пользователем. Разрешение пользователю предоставлять функции в качестве входных данных создает уязвимость выполнения произвольного кода.

globals()"funcName" работает

Другие вопросы по теме