Классы Python в Yaml / JSON

Я не доволен YAML / JSON.

Мне не хватает наследства.

Можно ли экспортировать иерархию классов Python в YAML / JSON?

Таким образом, я могу использовать свою любимую среду IDE с автозаполнением для построения структур данных.

В моем случае результат нужно передать в SaltStack. Но это никак не связано с управлением конфигурацией, так как результат должен быть простым YAML / JSON.

Я хочу экспортировать классы в yaml. Всегда будут только классы, а не экземпляры. По крайней мере, так я думаю сегодня.

Думаю, есть смысл использовать это ограничение: у классов не будет методов, кроме свойств. И только получить свойства, никогда не устанавливать свойства.

Я взял пример json из: https://www.json2yaml.com/

{
  "json": [
    "rigid",
    "better for data interchange"
  ],
  "yaml": [
    "slim and flexible",
    "better for configuration"
  ],
  "object": {
    "key": "value",
    "array": [
      {
        "null_value": null
      },
      {
        "boolean": true
      },
      {
        "integer": 1
      }
    ]
  },
  "paragraph": "Blank lines denote\nparagraph breaks\n",
  "content": "Or we\ncan auto\nconvert line breaks\nto save space"
}

Вот один из примеров вышеуказанного json в синтаксисе Python:

class json:
    data = ['rigi', 'better for data interchange']


class yaml:
    data = ['slim and flexible', 'better for configuration']


class object:
    key = 'value'
    array = [dict(null_value=None), dict(boolean=True), dict(integer=1)]


class paragraph:
    data = 'Blank lines denote\nparagraph breaks\n'


class content:
    data = '''Or we
can auto
convert line breaks
to save space'''

Выше показано, как можно создавать структуры данных с использованием классов Python.

YAML имеет наследование.

Daniel Roseman 10.04.2018 09:27

Вы хотите экспортировать определения классов в YAML или экземпляры класса?

flyx 10.04.2018 14:40

@flyx Я обновил вопрос: «Я хочу экспортировать классы в yaml. Всегда будут только классы, никогда не будут экземпляры. По крайней мере, так я думаю сегодня».

guettli 10.04.2018 15:32

Что ж, тогда вопрос в том, что вы хотите экспортировать. Только иерархия или еще информация о методах классов?

flyx 10.04.2018 19:08

@flyx Я обновил вопрос: «Я думаю, что имеет смысл использовать это ограничение: у классов не будет методов, кроме свойств. И только get-properties, никогда не set-properties». Другими словами: иерархия и данные классов.

guettli 11.04.2018 14:26

Я думаю, вам следует показать некоторый входной код Python, чтобы мы точно видели, с чем вы работаете. Я не уверен, что вы имеете в виду под имущество в Python.

flyx 11.04.2018 16:27
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
823
2

Ответы 2

Вы можете использовать jsonpickle. Обратите внимание, что меры безопасности при использовании pickle также применимы к jsonpickle. Если вы хотите разрешить де / сериализацию произвольных объектов, вам обязательно придется иметь дело с последствиями для безопасности.

Используйте json.Encoder, расширьте его, чтобы написать собственный класс для анализа классов Python, как показано ниже.

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

Например,

json.dumps(str)
# TypeError: Object of type 'mappingproxy' is not JSON serializable

Я не уверен, ищете ли вы jsonpickle

jsonpickle.dumps(str)
>>'{"py/type": "__builtin__.str"}'

jsonpickle.dumps(json.dumps)
>>'{"py/function": "json.dumps"}'

а также

import json
class ClassEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, type1):
            return obj.conversion
        # .type2
        # .
        # .type3
        # .
        # .so on
        # .
        return json.JSONEncoder.default(self, obj)

dict_str = json.dumps(class_object, cls=ClassEncoder)

Из dict_str выгрузите его тоже в YAML.

yaml.dump(dict_str)

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