Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
? {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]
: 1class A(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
print(yaml.dump(A(foo=True)))!!python/object:__main__.A {foo: true}!!python/…), — если вы решите написать YAML парсер вам придётся всё это поддерживать, хотя предоставлять какие‐либо конкретные нестандартные тёги от парсера не требуется (точнее, предоставлять их вообще, требуется предоставить возможность эти тёги создать).<< или "<<"? Второе и не должно работать: resolver’ы традиционно разрешают только plain scalar’ы.reader → scanner → parser → composer → resolver → constructor. Reader просто читает ввод и декодирует его. Scanner генерирует token’ы, и его, наверное, можно назвать lexer’ом. Parser из token’ов собирает более высокоуровневые события, но ещё не AST. Composer собирает из событий дерево. Resolver присваивает тёги всем значениям, если только они не имеют их в явном виде (именно из‐за последнего 1 — это не строка: по стандарту в failsafe schema это вполне себе "1" в виде plain scalar’а). И уже constructor генерирует непосредственно возвращаемый результат.В | есть /n на конце а в |- нет
Некоторые приемы YAML