2017-02-14 16 views
0

Я пытаюсь использовать YAML, поскольку мне нравится его читаемость.PyYAML - как бороться с композицией

Тем не менее, я немного озадачен наилучшим способом вставить компоненты/иметь дело с композицией.

Скажем, у меня есть это как класс я пытаюсь повторить:

basicai = aggressiveAI() 

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

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

Как бы лучший способ сделать что-то вроде этого в YAML?

В основном, я хотел бы иметь возможность не иметь длинный список специально названных компонентных объектов и основных объектов, которые все распространяются.

+0

Итак, вы создаете 'orc' и присваиваете значение переменной, которую мы не знаем в' fighter', а затем вы изменяете значение этой переменной ... что вы хотите показать с этим? Ваш код запутан. – flyx

+0

Кроме того, ваш код YAML недействителен и не помогает продемонстрировать, что вы хотите сделать. 'агрессивныйAI()' кажется вызовом, что это делает в данных YAML? '=' не является особым символом в YAML, вы, вероятно, хотите иметь ':'. – flyx

+0

Извините, я немного изменил его для ясности - данные YAML были всего лишь некоторым псевдокодом для того типа, которого я пытался достичь. Хотя, кажется, работает отлично для меня в коде YAML. – Retro

ответ

1

Если предположить, что у вас есть соответствующие конструкторы и representers для создания объектов, вы можете сделать:

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

Единственным проблематичным Ваш вызов функция dramaticdeath как YAML хранит объекты, а не вызовов функций. Поэтому сделайте так, чтобы поиск от строки до функции в методе __init__ класса Fighter

Недостаток не должен быть списком, вы можете, например. сделайте отображение верхнего уровня. Просто убедитесь, что ваши якоря определены, прежде чем использовать их в псевдонимах.

+0

Спасибо за помощь. Anthon, Что я пробовал? для этого нужно добавить все эти элементы в словарь, чтобы я мог их вызывать: 'monsters = {Object.name: Object for Object в yaml.load_all (monsterdata)}' Однако, похоже, я получаю атрибут AttributeError : Объект «Истребитель» не имеет атрибута «имя» - я представляю, что это потому, что он пытается читать каждый объект отдельно. Какой был бы лучший способ обойти это? – Retro

+0

@Retro Это зависит от того, как вы определили класс 'Object'. Я предлагаю вам создать новый вопрос с программой, как у вас есть сейчас (и обратитесь к этому в ссылке), потому что я не думаю, что это можно легко решить в комментариях к этому ответу. И вы не должны сильно изменять свой первоначальный вопрос (и сделать его движущейся мишенью). – Anthon

+0

Спасибо, я сделаю именно это. Я помечаю этот вопрос так, как я решил, что вы ответили на то, что я задал в вопросе, из того, что я могу напечатать. – Retro