【问题标题】:PyYAML - how to deal with compositionPyYAML - 如何处理组合
【发布时间】:2017-02-14 13:47:08
【问题描述】:

我一直在尝试使用 YAML,因为我喜欢它的可读性。

但是,我对放入组件/处理组合的最佳方式感到有些困惑。

假设我有这个作为我想要复制的类:

basicai = aggressiveAI()

fightercomponent = fighter(strength=10, dexterity=5, death=dramaticdeath())

orc = Object(name='orc', hp=100, fighter=fightercomponent, ai=basicai)

在 YAML 中执行此类操作的最佳方法是什么?

大多数情况下,我不希望得到一长串特别命名的组件对象和主要对象都散开的列表。

【问题讨论】:

  • 所以你正在创建一个orc 并将一个我们不知道的变量的值分配给fighter,然后你改变那个变量的值......你想要什么用那个显示?您的代码令人困惑。
  • 另外,您的 YAML 代码无效,无助于演示您想要做什么。 aggressiveAI() 似乎是一个电话,它在 YAML 数据中有什么作用? = 不是 YAML 中的特殊字符,您可能希望拥有 :
  • 抱歉,为了清楚起见,我对其进行了一些编辑 - YAML 数据只是我试图实现的那种类型的一些伪代码。虽然 = 在 YAML 代码中对我来说似乎工作得很好。
  • 那么代码第一行中fightercomponentbasicai 的值是多少?为什么之后要更改该值?还有,aggressiveAI()dramaticdeath()的定义是什么?
  • 啊,愚蠢的错误,我将它们设置在之后而不是之前。 AggressiveAI() 只是一个设置怪物应该做什么的类和其他一些类位,而 Dramadeath() 只是一个向玩家发送一些消息的函数

标签: python yaml composition


【解决方案1】:

假设您有适当的构造函数和表示器来创建对象,您可以这样做:

- !AggresiveAI &basicai 
- !Fighter &fightercomponent
     strength: 10
     dexterity: 5 
     death: dramaticdeath
- !Object 
    name: orc
    hp: 100
    fighter: *fightercomponent
    ai: *basicai

唯一有问题的是您对dramaticdeath 的函数调用,因为 YAML 存储对象而不是函数调用。因此,在 Fighter 类的 __init__ 方法中从字符串查找函数

顶层不必是列表,例如,您可以使顶层映射。只需确保在别名中使用锚点之前已定义它们即可。

【讨论】:

  • 感谢您的帮助 Anthon,我尝试将所有这些项目添加到字典中,以便我可以将它们叫出来:monsters = {Object.name : Object for Object in yaml.load_all(monsterdata)} 但是我似乎得到了一个 'AttributeError: 'Fighter' 对象没有属性 'name'' - 我想这是因为它试图分别读取每个对象。解决这个问题的最佳方法是什么?
  • @Retro 这取决于你如何定义类Object。我建议您使用该程序创建一个新问题,就像您现在拥有的那样(并在链接中参考这个问题),因为我认为在 cmets 中无法轻松解决这个问题。而且你不应该改变你原来的问题(并让它成为一个移动的目标)。
  • 谢谢 - 我会这样做的。我会将此标记为已解决,因为我相信您已经从我可以打印的内容中回答了我在问题中提出的问题。
猜你喜欢
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2019-11-17
  • 2018-02-01
  • 2021-01-10
相关资源
最近更新 更多