2010-07-13 74 views
-1

我正在編寫一個python應用程序。我想使用PyYaml將我的python對象轉儲到yaml中。我使用Python 2.6並運行Ubuntu Lucid 10.04。我在Ubuntu中使用PyYAML軟件包:http://packages.ubuntu.com/lucid/python/python-yaml用PyYaml將集合轉儲到YAML文件

我的對象有3個文本變量和一個對象列表。大概是這樣的:

ClassToDump: 

    #3 text variables 
    text_variable_1 
    text_variable_2 
    text_variable_3 
    #a list of AnotherObjectsClass instances 
    list_of_another_objects = [object1,object2,object3] 


AnotherObjectsClass: 
    text_variable_1 
    text_variable_2 
    text_variable_3 

我想轉儲的類包含一個AnotherObjectClass實例的列表。這個類有幾個文本變量。

PyYaml以某種方式不會轉儲AnotherObjectClass實例中的集合。 PyYAML會轉儲text_variable_1,text_variable_2和text_variable_3。

我使用以下pyYaml API轉儲ClassToDump例如:

classToDump = ClassToDump(); 
yaml.dump(ClassToDump,yaml_file_to_dump) 

沒有任何一個有傾銷的對象列表到YAML的經驗嗎?

下面是實際的完整的代碼片段:

def write_config(file_path,class_to_dump):  
    config_file = open(file_path,'w'); 
    yaml.dump(class_to_dump,config_file); 

def dump_objects(): 

rule = Miranda.Rule(); 
rule.rule_condition = Miranda.ALL 
rule.rule_setting = ruleSetting 
rule.rule_subjects.append(rule1) 
rule.rule_subjects.append(rule2) 
rule.rule_verb = ruleVerb 

write_config(rule ,'./config.yaml'); 

這是輸出:

!!蟒/對象:Miranda.Rule rule_condition:ALL rule_setting:!!蟒/對象: Miranda.RuleSetting {confirm_action:true,description:我的 配置,啓用:true,recursive:true,source_folder:source_folder} rule_verb:!! python/object:Miranda.RuleVerb {compression:true,dest_folder:/ home/zainul /下載, 類型:移動文件}

+0

「PyYaml不知何故不轉儲AnotherObjectClass實例中的集合「 - 什麼集合?到目前爲止,你所說的它包含三個文本變量。請考慮顯示一個小的具體示例(可執行腳本)加上它的輸出以及預期的輸出。 – 2010-07-13 03:34:42

+0

我認爲我原來的帖子中有一個錯字。我修改了我的問題。 – zfranciscus 2010-07-13 03:49:18

+0

您的代碼片段不可執行;未定義以下名稱:yaml,Miranda和4 x規則*。您沒有提供實際或預期的輸出。你真的希望回答者知道Miranda.Rule實例的樣子嗎?嘗試用一個可執行的Miranda自由腳本替代一個可以重現問題的小類。不要忘記實際/預期產出。 – 2010-07-13 04:41:56

回答

2

的PyYaml模塊需要爲你的細節問題,希望下面的代碼片段將幫助

import sys 
import yaml 

class AnotherClass: 
    def __init__(self): 
     pass 

class MyClass: 
    def __init__(self): 
     self.text_variable_1 = 'hello' 
     self.text_variable_2 = 'world' 
     self.text_variable_3 = 'foobar' 
     self.list_of_another_objects = [ 
      AnotherClass(), 
      AnotherClass(), 
      AnotherClass() 
     ] 

obj = MyClass() 
yaml.dump(obj, sys.stdout) 

代碼的輸出是:

!!python/object:__main__.MyClass 
list_of_another_objects: 
- !!python/object:__main__.AnotherClass {} 
- !!python/object:__main__.AnotherClass {} 
- !!python/object:__main__.AnotherClass {} 
text_variable_1: hello 
text_variable_2: world 
text_variable_3: foobar 
+0

謝謝安德魯。我會在我的本地盒子裏試試看看它是怎麼回事。 =)歡呼 – zfranciscus 2010-07-17 21:16:15