2013-06-19 2 views
3

다른 객체 안에 객체를 만들 수있는 yaml 형식을 만들려고합니다. 이 예제에서는 State Machine 개체를 만들려고하고 동시에 상태와 개체 사이의 연결을 채 웁니다.Python, yaml 중첩 된 객체

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

! 형 MyStateMachine의 목적

! 상태를 생성하는 생성자가 상태 기 MyState

! 연결 유형의 객체를 생성하는 생성자가 객체 생성 사용해야 생성자가 P1의 이름을 지정하고 내가이 여기에 문제가 그것을

에 연결을 추가 :

1 - 구축물을 또는 대한 상태 기 만든 후 상태은이라고하며

2 내부 상태는 존재하지 않는다 - 객체 (P1)를 검색하고 그 위에 add_connection 메소드를 호출한다.

+0

힘든 일입니다. 이와 비슷한 것을 원했을 때 (다른 객체의 특정 키에 대한 값인/참조로 매핑하는 문자열에서) 나는 YAML 네이티브 데이터 구조의 꼭대기에 맞춤형 디어 리아제이션 단계를 추가했습니다. – delnan

답변

6

개체

에 대한 진정한 pyyaml 구문을 시도 할 수 있습니다 사전에

감사

myyaml.py :

p1 
p2 
['p1', 'p2'] 

을 그리고 yaml.load을하지 마십시오 :

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) 

가져옵니다() 모듈의 루트 블록에서 항상 if __name__ == '__main__'을 사용하거나 af 내에서 호출하십시오 당신이 한 번 호출 될 것이라는 확신을주는 YAML 다른 맥락에서, 다시 myyaml.py를 가져하려고이 시점에서

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

, 당신은 YAML을 넣어 경우 모듈의 루트에있는 모든 코드는 실행됩니다 :

그 YAML 문을 유의하시기 바랍니다 .load 또는 모듈의 루트에서 이와 비슷한 경우 무한 루프 나 예기치 않은 결과가 발생할 수 있습니다.

+0

감사합니다 그것은 매력처럼 일했습니다 : D – jpereira