我一直在努力掌握PyYAML,因为我喜欢它的可读性,并且希望在一些开源项目中使用它作为JSON的替代品。在
然而,我正在努力理解如何用组合构造对象。我打开了这个问题:PyYAML - how to deal with compositon它似乎在读出信息方面有效,但在整个程序的上下文中却不行。在
这里有一个简单的例子来说明我想要表达的意思:
import yaml
import data
class DungeonObject(yaml.YAMLObject):
yaml_tag = u'!DungeonObject'
def __init__(self, x, y, char, name, blocks=False, fighter=None):
self.x = x
self.y = y
self.char = char
self.name = name
self.blocks = blocks
self.fighter = fighter
if self.fighter:
self.fighter.owner = self
def __repr__(self):
return "%s(x=%r, y=%r, char=%r, name=%r, blocks=%r fighter=%r)" % (self.__class__.__name__, self.x, self.y, self.char, self.name, self.blocks, self.fighter)
class Fighter(yaml.YAMLObject):
yaml_tag = u'!Fighter'
#combat-related properties and methods (monster, player, NPC).
def __init__(self, hp, defense, strength):
self.hp = hp
self.base_defense = defense
self.base_strength = strength
def __repr__(self):
return "%s(hp=%r, defense=%r, strength=%r)" % (self.__class__.__name__, self.hp, self.defense, self.strength)
monsters = {DungeonObject.name : DungeonObject for DungeonObject in yaml.load_all(data.monsterdata)}
print (monsters)
还有我的YAML文件:
^{pr2}$有了这个,我得到了一个错误: 第32行,英寸 怪物={地下对象.name:中的DungeonObject的DungeonObject全部加载(数据怪兽数据)} AttributeError:“Fighter”对象没有属性“name”
每个文档都应该包含一个由
Fighter
和DungeonObject
组成的序列/列表。前者没有名字,所以你应该过滤那些实际上是DungeonObject类型而不是Fighter类型的DungeonObject。在有点令人困惑的是,您还使用了一个变量DungeonObject,因此请尝试使用
dungeon_object
作为变量:它给出了:
^{pr2}$我更新了
__repr__
以使用更现代的.format()
方法。因为我正在使用拉梅尔亚姆勒(这是PyYAML功能的超集,并且向后兼容),我需要显式地指定加载程序,以消除使用默认加载程序时load_all
不安全的警告。(免责声明:我是该软件包的开发者)相关问题 更多 >
编程相关推荐