jpe*_*ira 3 python yaml pyyaml deserialization
我正在尝试创建一个yaml格式,允许我在另一个对象中创建一个对象.在这个示例中,我尝试创建一个State Machine对象,同时在它们之间填充一些状态和连接.
yaml.load("""
!statemachine {
states: [
!state { name: p1 },
!state { name: p2 },
!state { name: p3 },],
connections:
[!connection { 'pim' : [p1,p2]}]}
""")
Run Code Online (Sandbox Code Playgroud)
!statemachine有一个构造函数,可以生成MyStateMachine类型的对象
!state有一个构造函数,它生成一个MyState类型的对象
!connection有一个构造函数,它应该使用名称为p1的对象生成并添加一个连接
我这里有两个问题:
1 - 在创建statemachine并且其中不存在状态之后调用state的构造函数
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)
Run Code Online (Sandbox Code Playgroud)
获取:
p1
p2
['p1', 'p2']
Run Code Online (Sandbox Code Playgroud)
永远不要在模块的根块中尝试yaml.load(),总是if __name__ == '__main__'
在一个函数中使用或调用它,确保它将被调用一次.
请注意yaml声明:
!!python/object:myyaml.State { name: p1 },
Run Code Online (Sandbox Code Playgroud)
此时yaml尝试再次导入myyaml.py,在另一个上下文中,并且将执行模块根目录中的所有代码,如果你在模块的根目录中放入yaml.load或类似的东西,你可能遇到无限循环,或意外的结果.
归档时间: |
|
查看次数: |
3157 次 |
最近记录: |