Pull to refresh
8
0

Научные исследования

Send message

[] — пустой список
[:] — ordered dict

Важны, если используется стиль форматирования для именованного элемента в духе YAML. Например:


person { name:"Иванов" age:30 }

здесь не важны, но для


person
   name: "Иванов"
   age: 30

важны.


Для списков, словарей, множества, кортежа — не важны, так как для них не предусмотрен стиль форматирования в стиле YAML.

Никто не ожидает того, что AXON или любой другой формат сразу заменит JSON. Вспомните сколько прошло времени для того, чтобы JSON API стали включать наравне с XML API.


Чтобы быть более точным, если AXON и стоит использовать, то только в новых проектах.

Стандарты время от времени меняются.

В данном случае причина была в следующем: в сообщении при декодировании в одних местах нужен был dict, а в других — ordered dict (благо в python он есть). К моему удивлению он хранил конфигурацию для своей системы.

Согласен, что в этом примере это так. Если нужно без полей, то тогда возможен следующий вариант:


persons {
   ("Иванов" 30)
   ("Сидоров" 33)
}

@axon.factory("persons")
def persons_factory(attrs, vals):
    return [Person(*val) for val in vals]

vals = axon.loads(text, mode="strict")
print(vals)

XML без пространств имен можно также по ходу преобразовать в AXON. Для этого достаточно прочитать его, например, при помощи etree или lxml.etree и вставить получившийся объект с именем, скажем xml. Зарегистрировать reducer для типов XmlElement, XmlDocument, XmlAttribute. Затем во время dump-инга он преобразуется в представление в нотации AXON. Если зарегистрировать factory функциию для элемента xml, то после загрузки вв соответствующем месте будет XmlDocument.

Кстати нотация для ordered dict была добавлена по предложению одного пользователя. Для него это было важно.

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


Без отображения — это Node. С отображением — список объектов типа, который вернет get_type_factory.

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


Что касается JSON 2.0, то он принципиально привязан в синтаксису javascript. И скорее всего, придется ждать пока все перечисленное не появится в формате JSON как части javascript.

Ну может получиться нечто вроде этого:


..............
       config: "
option1: \"asdasdsadsd\"
option2: \"erwrwetrter\"
option3: \"vcnbnbmv\"
"
............

Для этих целей преудсмотрена альтернатива:


..............
       config: `
option1: "asdasdsadsd"
option2: "erwrwetrter"
option3: "vcnbnbmv"
`
............

Символ ` конечно нелегко заметить, может имеет смысл заменить его ```.

А можно так:


data {
   type: ("name" "scope")
  ("A" 90)
  ("B" 80)
  ("C" 70)
  ("D" 60)
}

@axon.factory("data")
def data_factory(attrs, vals):
   name, scope = attrs["type"]
   tp = get_type_factory(name, scope)
   return [tp(args) for  args in vals]

Да можно, но при этом усложнится обработка такого массива.


В данном случае просто есть встроенная возможность получить словарь (ordered dict).

Строка из одной кавычки будет записана как "\""


Для массива из однотипных объектов можно было бы предложить, например, такое решение:


persons {
   {name: "Иванов" age: 30}
   {name:  "Сидоров" age:33}
}

@axon.factory("persons")
def persons_factory(attrs, vals):
    return [Person(**val) for val in vals]

vals = axon.loads(text, mode="strict")
print(vals)

В результате получим


[[Person(name='Иванов', age=30), Person(name='Сидоров', age=33)]]

Просто текст, заключенный в кавычки может состоять из нескольких строк.

Без кавычек можно только идентификаторы.


Необходимость всегда использовать кавычки, как показал мне интернет — не совсем надуманные, впрочем единого мнения тут нет. Что касается запятых, то они, вообще говоря, не обязательны.


Для ответа на второй нужно было бы подробнее описать возможности библиотеки. Но для этого скорее всего получится еще одна статья.


Если кратко, то, например, можно отображать именованные элементы в объекты. Для этого регистрируется функция для его создания.
Пример приведен в ответе для amaksr.

Комментарии в AXON имеются в стиле python.


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

[ name: "Alex"
birth: ^1979-12-25
email: "mail@example.com"]

это не массив

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


Разные типы объектов использовать можно. В библиотеке pyaxon есть возможность отображать классы на именованные структурные объекты. Например, можно отобразить


person { name: "Иванов" age: 30 }

на namedtuple, определив:


text = """
person { name:"Иванов" age:30 }
"""
Person = namedtuple("Person", "name age")

@axon.factory("person")
def Person_factory(attrs, vals):
    return Person(**attrs)

vals = axon.loads(text, mode="strict")
print(vals[0])

Определение типа для всего списка AXON и библиотека pyaxon пока еще не поддерживает.

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Registered
Activity