Я не доволен 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 или экземпляры класса?
@flyx Я обновил вопрос: «Я хочу экспортировать классы в yaml. Всегда будут только классы, никогда не будут экземпляры. По крайней мере, так я думаю сегодня».
Что ж, тогда вопрос в том, что вы хотите экспортировать. Только иерархия или еще информация о методах классов?
@flyx Я обновил вопрос: «Я думаю, что имеет смысл использовать это ограничение: у классов не будет методов, кроме свойств. И только get-properties, никогда не set-properties». Другими словами: иерархия и данные классов.
Я думаю, вам следует показать некоторый входной код Python, чтобы мы точно видели, с чем вы работаете. Я не уверен, что вы имеете в виду под имущество в Python.






Вы можете использовать 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)
YAML имеет наследование.