擅长:python、mysql、java
<p>如果您有许多标记,但不想为所有标记创建对象,或者如果您不关心返回的实际类型,只关心点式访问,则可以使用以下代码捕获所有未定义的标记:</p>
<pre><code>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)
</code></pre>
<p>如果您想知道为什么<code>my_construct_undefined</code>中间有一个<code>yield</code>:它允许单独实例化对象,而不创建其子对象。一旦对象存在,就可以引用它,以防它有一个锚,而子对象(或其子对象)有一个引用。创建对象的实际机制首先创建它,然后对它执行<code>next(x)</code>操作来完成它。</p>