Как стать автором
Обновить

Комментарии 18

НЛО прилетело и опубликовало эту надпись здесь
Поправил. Спасибо.

И еще спасибо всем кто написал об этом в личку.
В YAML вообще много интересных вещей. Например, словари‐ключи: ? {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 нотации использовали << или "<<"? Второе и не должно работать: 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 генерирует непосредственно возвращаемый результат.
Хотя, наверное, в JSON схеме просто нету нужного resolver’а для <<. Попробуйте перед этим явно указать тёг: !!tag:yaml.org,2002:merge <<: *…
> И да пребудет с вами KISS

Авторы YAML не смогли выбрать какой-то один синтаксис, поэтому теперь там есть по 5 способов записать одно и то же. Из-за чего библиотеки огромные, глючат, тормозят и отстают от спецификации, а люди то и дело косячат выбирая не тот тип многострочного текста и тп. Как-то не очень это KISS.
НЛО прилетело и опубликовало эту надпись здесь
Способы все таки немного отличаются и каждый раз можно выбрать то что лучше подходит.
Так возможно не нужно было выделять >, >- (и до кучи >+ ) в отдельные способы, тк они всего лишь по разному трактуют конец строки.

А в прочем согласен, KISS в спецификации не хвататет, и собственно по этому KISS нужен прежде всего тому кто на YAML пишет.
Ox, я не уверен, что это хорошо. Один напишет, другим читать.
С момента первого открытия Makefile побаиваюсь всяких $$+, $<, ит.п. приблуд призванных 'упростить' нам жизнь.

В | есть /n на конце а в |- нет

В | есть /n на конце а в |- нет

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории