2010-07-13 5 views
-1

J'écris une application python. J'essaie de vider mon objet python dans yaml en utilisant PyYaml. J'utilise Python 2.6 et exécute Ubuntu Lucid 10.04. J'utilise le paquet PYYAML dans le paquet Ubuntu: http://packages.ubuntu.com/lucid/python/python-yamlDéposer une collection dans un fichier YAML avec PyYaml

Mon objet a 3 variables de texte et une liste d'objets. En gros, il est quelque chose comme ceci:

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 

La classe que je veux vider contient une liste des instances AnotherObjectClass. Cette classe a quelques variables de texte.

PyYaml ne rejette en quelque sorte pas les collections dans l'occurrence AnotherObjectClass. PyYAML effectue le vidage de text_variable_1, de text_variable_2 et de text_variable_3.

J'utilise l'API PyYAML suivante pour sauvegarder exemple ClassToDump:

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

Est-ce que quelqu'un a une expérience avec le dumping une liste d'objets en YAML?

Voici l'extrait de code complet réel:

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'); 

Ceci est la sortie:

!! python/objet: Miranda.Rule rule_condition: ALL rule_setting: !! python/objet: Miranda.RuleSetting {confirm_action: true, description: Ma Configuration, activé: vrai, récursif: vrai, dossier_fichier: dossier_fichier} rule_verb: !! python/objet: Miranda.RuleVerb {compression: true, dest_folder:/home/zainul/Téléchargements, Déplacer le fichier}

+0

« PyYAML quelque sorte ne jetez pas les collections dans l'instance AnotherObjectClass "- quelles collections? Jusqu'à présent, tout ce que vous avez dit qu'il contient est trois variables de texte. S'il vous plaît envisager d'afficher un petit exemple concret (script exécutable) plus sa sortie plus ce que la sortie attendue est. –

+0

Je pense qu'il y a une faute de frappe dans mon message original. J'ai modifié ma question. – zfranciscus

+0

Votre extrait de code n'est PAS exécutable. les noms suivants ne sont pas définis: yaml, Miranda et 4 x règle *. Vous n'avez fourni aucune sortie réelle ou attendue. Est-ce que vous vous attendez vraiment à ce que les répondeurs sachent à quoi ressemble une instance de Miranda.Rule? Essayez de substituer une petite classe qui peut être épelée dans un script exécutable sans Miranda qui reproduit le problème. Ne pas oublier la production réelle/attendue. –

Répondre

2

Le module PyYAML prend soin des détails pour vous, je l'espère l'extrait suivant aidera

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) 

La sortie de ce code est:

!!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

Merci andrew. Je vais l'essayer dans ma boîte locale et voir comment ça se passe. =) acclamations – zfranciscus

Questions connexes