Комментарии 18
НЛО прилетело и опубликовало эту надпись здесь
В YAML вообще много интересных вещей. Например, словари‐ключи:
И, конечно, есть тёги, позволяющие сериализовать и десериализовать множество классов «из коробки» и вообще всё, что угодно:
Это возможности языка, а не библиотеки pyyaml — от последней здесь конкретный вид нестандартных тёгов (
? {This: is a key}: (now find library which will swallow dictionary in key)
. Pyyaml можно заставить это сожрать, используя собственный конструктор, но по‐умолчанию будетConstructorError: while constructing a mapping
in "<unicode string>", line 1, column 1:
? {This: is a key}: (now find li ...
^
found unhashable key
in "<unicode string>", line 1, column 3:
? {This: is a key}: (now find libr ...
Более реальный пример:print(yaml.dump({(True, False): 1}))
? !!python/tuple [true, false]
: 1
И, конечно, есть тёги, позволяющие сериализовать и десериализовать множество классов «из коробки» и вообще всё, что угодно:
class A(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
print(yaml.dump(A(foo=True)))
!!python/object:__main__.A {foo: true}
Это возможности языка, а не библиотеки pyyaml — от последней здесь конкретный вид нестандартных тёгов (
!!python/…
), — если вы решите написать YAML парсер вам придётся всё это поддерживать, хотя предоставлять какие‐либо конкретные нестандартные тёги от парсера не требуется (точнее, предоставлять их вообще, требуется предоставить возможность эти тёги создать).Кстати, на сайте yaml.org есть фактически 3 библиотеки с поддержкой YAML-1.2: Haskell (reference parser), C++ и VimL (относительно последнего знаю про 1.2 только потому что сам писал). Всё остальное: 1.0 или 1.1. Это как‐то странно.
Похоже сайт не особо обновляется. Вот для PHP поддержка YAML-1.2: github.com/symfony/yaml
Только без наследования. Проверял по примеру из поста. Да и в документации к 1.2 про "<<: " ничего не сказано. Это, видимо, фича от python?
UPD: ан-нет, упоминание наследования есть в п. 3.2 (только без примеров). Видимо symfony упустили этот момент.
UPD2: github.com/symfony/yaml наследование не работает только в JSON нотации. В обычной всё ок.
А вы в JSON нотации использовали
Для тех, кто не в курсе: pyyaml устроен так:
<<
или "<<"
? Второе и не должно работать: resolver’ы традиционно разрешают только plain scalar’ы.Для тех, кто не в курсе: pyyaml устроен так:
reader → scanner → parser → composer → resolver → constructor
. Reader просто читает ввод и декодирует его. Scanner генерирует token’ы, и его, наверное, можно назвать lexer’ом. Parser из token’ов собирает более высокоуровневые события, но ещё не AST. Composer собирает из событий дерево. Resolver присваивает тёги всем значениям, если только они не имеют их в явном виде (именно из‐за последнего 1
— это не строка: по стандарту в failsafe schema это вполне себе "1"
в виде plain scalar’а). И уже constructor генерирует непосредственно возвращаемый результат.> И да пребудет с вами KISS
Авторы YAML не смогли выбрать какой-то один синтаксис, поэтому теперь там есть по 5 способов записать одно и то же. Из-за чего библиотеки огромные, глючат, тормозят и отстают от спецификации, а люди то и дело косячат выбирая не тот тип многострочного текста и тп. Как-то не очень это KISS.
Авторы YAML не смогли выбрать какой-то один синтаксис, поэтому теперь там есть по 5 способов записать одно и то же. Из-за чего библиотеки огромные, глючат, тормозят и отстают от спецификации, а люди то и дело косячат выбирая не тот тип многострочного текста и тп. Как-то не очень это KISS.
НЛО прилетело и опубликовало эту надпись здесь
Способы все таки немного отличаются и каждый раз можно выбрать то что лучше подходит.
Так возможно не нужно было выделять >, >- (и до кучи >+ ) в отдельные способы, тк они всего лишь по разному трактуют конец строки.
А в прочем согласен, KISS в спецификации не хвататет, и собственно по этому KISS нужен прежде всего тому кто на YAML пишет.
Так возможно не нужно было выделять >, >- (и до кучи >+ ) в отдельные способы, тк они всего лишь по разному трактуют конец строки.
А в прочем согласен, KISS в спецификации не хвататет, и собственно по этому KISS нужен прежде всего тому кто на YAML пишет.
Ox, я не уверен, что это хорошо. Один напишет, другим читать.
С момента первого открытия Makefile побаиваюсь всяких $$+, $<, ит.п. приблуд призванных 'упростить' нам жизнь.
Не понял, в чём отличие «|» от «|-».
В | есть /n на конце а в |- нет
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Некоторые приемы YAML