2013-06-19 113 views
3

我想創建一個yaml格式,允許我在另一個對象內創建一個對象。 在這個示例中,我試圖創建一個狀態機對象,同時用它們之間的一些狀態和連接來填充它。Python,yaml嵌套對象

yaml.load(""" 
!statemachine { 
    states: [ 
     !state { name: p1 }, 
     !state { name: p2 }, 
     !state { name: p3 },], 
    connections: 
     [!connection { 'pim' : [p1,p2]}]} 
""") 

!的statemachine有一個生成類型MyStateMachine的目的

!狀態的構造有一個生成類型的對象MyState

!連接構造具有應該使用與所生成的對象的構造命名p1和添加到它

連接我有2個問題在這裏:

1 - 將構建或用於創建的statemachine後狀態被調用並且狀態是不存在其內部

2 - 檢索對象p1和調用該方法add_connection在它。

在此先感謝

+0

這很難。當我需要類似這樣的東西時(從一個字符串中去,這個字符串是另一個對象中特定鍵的值/映射到一個引用)我在本地YAML數據結構之上添加了一個自定義反序列化步驟。 – delnan

回答

6

讓我們嘗試真正的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'] 

而且從來沒有嘗試yaml.load ()在模塊的根塊中,始終使用if __name__ == '__main__'或在af內調用它你確保它會被調用一次。

請注意YAML聲明:

!!python/object:myyaml.State { name: p1 }, 

此時YAML試圖再次導入myyaml.py,在另一種情況下,並在模塊的根目錄下的所有代碼會被執行,如果你把YAML .load或類似的東西在模塊的根目錄中,你可能遇到一個無限循環或意外的結果。

+0

感謝它像一個魅力工作:D – jpereira