Есть ли способ построить объект, используя PyYAML construct_mapping после завершения загрузки всех узлов?

Я пытаюсь создать последовательность yaml в python, которая создает пользовательский объект python. Объект должен быть построен с помощью диктов и списков, которые деконструируются после__init__, Однако, похоже, что функция construct_mapping не создает полное дерево встроенных последовательностей (списков) и диктовок.

Учтите следующее:

import yaml

class Foo(object):
    def __init__(self, s, l=None, d=None):
        self.s = s
        self.l = l
        self.d = d

def foo_constructor(loader, node):
    values = loader.construct_mapping(node)
    s = values["s"]
    d = values["d"]
    l = values["l"]
    return Foo(s, d, l)
yaml.add_constructor(u'!Foo', foo_constructor)

f = yaml.load('''
--- !Foo
s: 1
l: [1, 2]
d: {try: this}''')

print(f)
# prints: 'Foo(1, {'try': 'this'}, [1, 2])'

Это работает нормально, потому чтоf содержит ссылки наl а такжеd объекты, которые фактически заполнены даннымипосле Foo объект создан.

Теперь давайтесделать что-то более сложное:

class Foo(object):
    def __init__(self, s, l=None, d=None):
        self.s = s
        # assume two-value list for l
        self.l1, self.l2 = l
        self.d = d

Теперь мы получаем следующую ошибку

Traceback (most recent call last):
  File "test.py", line 27, in 
    d: {try: this}''')
  File "/opt/homebrew/lib/python2.7/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/opt/homebrew/lib/python2.7/site-packages/yaml/constructor.py", line 39, in get_single_data
    return self.construct_document(node)
  File "/opt/homebrew/lib/python2.7/site-packages/yaml/constructor.py", line 43, in construct_document
    data = self.construct_object(node)
  File "/opt/homebrew/lib/python2.7/site-packages/yaml/constructor.py", line 88, in construct_object
    data = constructor(self, node)
  File "test.py", line 19, in foo_constructor
    return Foo(s, d, l)
  File "test.py", line 7, in __init__
    self.l1, self.l2 = l
ValueError: need more than 0 values to unpack

Это связано с тем, что конструктор yaml запускается на внешнем слое, перед тем как вложить все объекты, до того как все узлы будут завершены. Есть ли способ изменить порядок и начать сначала с глубоко внедренных (например, вложенных) объектов? В качестве альтернативы, есть ли способ заставить строительство по крайней мерепосле узел "s объекты были загружены?

Ответы на вопрос(3)

Ваш ответ на вопрос