Если у вас много тегов и вы не хотите создавать объекты для всех них, или если вам не нужен фактический возвращаемый тип, а только доступ с точками, вы перехватываете все неопределенные теги с помощью следующего кода:
import yaml
class Blob(object):
def update(self, kw):
for k in kw:
setattr(self, k, kw[k])
from yaml.constructor import SafeConstructor
def my_construct_undefined(self, node):
data = Blob()
yield data
value = self.construct_mapping(node)
data.update(value)
SafeConstructor.add_constructor(None, my_construct_undefined)
class User(object):
def __init__(self, name, surname):
self.name= name
self.surname= surname
user = User('spam', 'eggs')
serialized_user = yaml.dump(user)
#Network
deserialized_user = yaml.safe_load(serialized_user)
print "name: %s, sname: %s" % (deserialized_user.name, deserialized_user.surname)
Если вам интересно, почему my_construct_undefined
имеет yield
в середине: это позволяет создавать экземпляр объекта отдельно от создания его потомков. Когда объект существует, на него можно ссылаться, если у него есть привязка, а у дочерних элементов (или их дочерних элементов) есть ссылка. Фактический механизм создания объекта сначала создает его, а затем выполняет next(x)
для его завершения.