2017-03-17 3 views
1

Ich benutze PyYAML-Dump, um komplexe Datenstrukturen zu drucken, aber es gibt eine Klasse von Objekten, die nicht und auch nicht ausgegeben werden kann.Ignorieren von Objekten für PyYAML-Dump

Derzeit erhalte ich:

yaml.representer.RepresenterError: cannot represent an object 

ich yaml.dump möchte vollständig diese besondere Klasse ignorieren oder einfach nur die Klassennamen machen und wie gewohnt weiter.

Wenn dies möglich ist, wie kann ich das tun?

Antwort

0

Sie müssen einen Vertreter für das Objekt bereitstellen. Dazu gibt es mehrere Möglichkeiten, von denen einige das Objekt ändern.

Wenn Sie explizit eine Representer registrieren, das Objekt nicht geändert werden:

import sys 
from ruamel import yaml 


class Secret(): 
    def __init__(self, user, password): 
     self.user = user 
     self.password = password 


def secret_representer(dumper, data): 
     return dumper.represent_scalar(u'!secret', u'unknown') 

yaml.add_representer(Secret, secret_representer) 

data = dict(a=1, b=2, c=[42, Secret(user='cary', password='knoop')]) 

yaml.dump(data, sys.stdout) 

In secret_representer, die data wird die instanziiert Secret(), da die Funktion, dass nicht verwendet, keine „Geheimnisse "sind durchgesickert. Sie könnten auch z.B. gib den Benutzernamen zurück, aber nicht das Passwort. Die Funktion represent_scalar erwartet ein Tag (hier habe ich !secret benutzt) und einen Skalar (hier die Zeichenkette unknown).

Der Ausgang des oben:

a: 1 
b: 2 
c: [42, !secret '[unknown]'] 

Ich verwende ruamel.yaml in der obigen denen eine verbesserte Version des PyYAML (Disclaimer: Ich bin der Autor dieses Pakets). Das obige sollte auch mit PyYAML funktionieren.

Verwandte Themen