我正在尝试创建一个 yaml 格式,允许我在另一个对象中创建一个对象。 在这个示例中,我试图创建一个状态机对象,同时用一些状态和它们之间的连接填充它。
yaml.load("""
!statemachine {
states: [
!state { name: p1 },
!state { name: p2 },
!state { name: p3 },],
connections:
[!connection { 'pim' : [p1,p2]}]}
""")
!statemachine 有一个生成 MyStateMachine 类型对象的构造函数
!state 有一个构造函数生成一个 MyState 类型的对象
!connection 有一个构造函数,它应该使用以名称 p1 生成的对象并向其添加连接
我这里有两个问题:
1 - state 的构造函数在创建 statemachine 并且其中不存在状态后调用
2 - 检索对象 p1 并在其上调用方法 add_connection。
提前致谢
最佳答案
让我们试试真正的 pyyaml对象语法
myyaml.py:
import yaml,sys
class StateMachine(object):
pass
class State(object):
pass
class Connection(object):
pass
if __name__ == '__main__':
o = yaml.load("""
!!python/object:myyaml.StateMachine {
states: [
!!python/object:myyaml.State { name: p1 },
!!python/object:myyaml.State { name: p2 },
!!python/object:myyaml.State { name: p3 },],
connections:
[ !!python/object:myyaml.Connection { 'pim' : [p1,p2]}]}
""")
print o.states[0].name
print o.states[1].name
print o.connections[0].pim
sys.exit(0)
获取:
p1
p2
['p1', 'p2']
永远不要在模块的根 block 中尝试 yaml.load(),始终使用 if __name__ == '__main__'
或在函数中调用它,确保它会被调用一次。
请注意yaml语句:
!!python/object:myyaml.State { name: p1 },
此时 yaml 尝试在另一个上下文中再次导入 myyaml.py,并且将执行模块根目录中的所有代码,如果您将 yaml.load 或类似的东西放在模块根目录中,您可能会遇到死循环,或者意想不到的结果。
关于Python、yaml嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17188306/