Bunu yapmanın en kolay yolu, YAML yapıcısının tag:yaml.org,2002:map
için üzerine yazılmasıdır, bu yüzden sıradan bir sözlük yerine özel bir sözlük sınıfı döndürür. Bu da her şey normal Python şekilde çalışması için bekliyorsa, YAML kullanan süreçte başka her şeyi kıracak
import yaml
class AttrDict(object):
def __init__(self, attr):
self._attr = attr
def __getattr__(self, attr):
try:
return self._attr[attr]
except KeyError:
raise AttributeError
def construct_map(self, node):
# WARNING: This is copy/pasted without understanding!
d = {}
yield AttrDict(d)
d.update(self.construct_mapping(node))
# WARNING: We are monkey patching PyYAML, and this will affect other clients!
yaml.add_constructor('tag:yaml.org,2002:map', construct_map)
YAML = """
config:
- id: foo
- name: bar
content:
- run: xxx
- remove: yyy
"""
obj = yaml.load(YAML)
print(obj.config[0].id) # prints foo
Not. Özel bir yükleyici kullanabilirsiniz, ancak PyYAML belgelerini kişisel olarak biraz labirentte buluyorum ve yan etkilerin bir istisna olmaktan ziyade bir kural olarak küresel ve bulaşıcı olduğu görülüyor.
Uyardınız. Bir alternatif olarak
, şema kendi sınıfları yazmak ve olanlara serisini olabilir nispeten durağan ise (örneğin class Config
id
ve name
özelliklere sahip). Ancak, muhtemelen ekstra kodun maliyetine değmez.
http://stackoverflow.com/questions/2352181/how-to-use-a-dot-to-access-members-of-dictionary dosyasının kopyası – Justin
@Justin: Bu sorunun bir kopyası değil. çünkü YAML yükleyicisini, "dict" örneklerinden ziyade, arzu ettiğiniz herhangi bir sınıftaki nesneleri yaratmak için basitçe yamalayabilirsiniz. –