Is it possible to disable creating anchors and references (and effectively list redundant data explicitly) either in PyYAML
or Ruby's Psych
engine?
Perhaps I missed something while searching the web, but it seems there are not many options available in Psych
and I was not able to determine if PyYAML
allows for that either.
The rationale is I have to serialize some data and pass it in a readable form to a not-really-technical co-worker for manual validation. Some data is redundant but I need it listed in a most explicit manner for readability (anchors and references are a nice concept for efficiency, but not for human-readability).
Ruby and Python are my tools of choice, but if there is some other reasonably simple way of 'unfolding' YAML documents, it might just do.
Introducing YAML anchors We define an anchor using the &some_name syntax immediately before the YAML node we want that anchor to point to. We can then use the *some_name syntax later in the YAML to reference that anchor as many times as we want.
&id001 - example of an anchor, placed with the first occurrence of data. *id001 - example of an alias, replaces subsequent occurrence of data.
YAML Aliases allow you to assign a name to a value or block of data and recall the assigned data by its name in the YAML file. Aliases should work for any file written in YAML.
I found this related ticket on the PyYAML website (http://pyyaml.org/ticket/91), it looks like anchors can be disabled by using a custom dumper along the lines of:
import yaml
class ExplicitDumper(yaml.SafeDumper):
"""
A dumper that will never emit aliases.
"""
def ignore_aliases(self, data):
return True
So, for example, the following outputs can be achieved using the standard dumper and the new explicit dumper:
>>> yaml.dump([1L, 1L])
"[&id001 !!python/long '1', *id001]\n"
>>> yaml.dump([1L, 1L], Dumper=ExplicitDumper)
'[1, 1]\n'
You can customise further properties to ensure pretty-printing etc. in the yaml.dump(...)
call.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With