¿Hay una manera de construir un objeto usando PyYAML construct_mapping después de que todos los nodos se hayan cargado por completo?

Estoy tratando de hacer una secuencia yaml en python que crea un objeto python personalizado. El objeto debe construirse con dictados y listas que se deconstruyen después de__init__. Sin embargo, parece que la función construct_mapping no construye el árbol completo de secuencias incrustadas (listas) y dictados.
Considera lo siguiente:

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])'

Esto funciona bien porquef tiene las referencias a lal yd Objetos, que en realidad están llenos de datos.después laFoo Se crea el objeto.

Ahora, hagamos algo un poco más complicado:

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

Ahora obtenemos el siguiente error

Traceback (most recent call last):
  File "test.py", line 27, in <module>
    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

Esto se debe a que el constructor yaml está comenzando en la capa exterior de anidamiento antes y está construyendo el objeto antes de que se terminen todos los nodos. ¿Hay una manera de invertir el orden y comenzar con objetos profundamente incrustados (por ejemplo, anidados) primero? Alternativamente, ¿hay una manera de hacer que la construcción suceda al menosdespués Los objetos del nodo han sido cargados?

Respuestas a la pregunta(3)

Su respuesta a la pregunta