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.