Take this example code:
from ruamel.yaml import YAML
import sys
yaml = YAML(pure=True)
yaml.allow_duplicate_keys = True
yaml.preserve_quotes = True
internal_dictionary = yaml.load("Key: \"value\"")
yaml.dump(code, sys.stdout)
Output:
Key: "value"
The internal_dictionary contains:
Key: value
But in the dump and the input file the value is between two ", ruamel knows this as it gets dumped correctly, is there I way where I can see it too in the phase where it is stored in the internal_dictionary without the two "?
CodePudding user response:
An exact answer would probably require a look at the code, but we see that the values have different data types.
The default type would be a string, but when the value is quoted, the type is a ruamel.yaml.scalarstring.DoubleQuotedScalarString
with the "style" property.
CodePudding user response:
Assuming you load with yaml.preserve_quotes = True
, if your scalar is unquoted and has no anchor (and is not recognised as a float, datetime, boolean, etc), the type of internal_dictionary['Key']
will be a normal Python string.
If the scalar is not an unquoted string , one of the types from ruamel/yaml/scalarstring.py
is created: SingleQuotedScalarString
, DoubleQuotedScalarString
, LiteralScalaString
, FoldedScalarString
, PlainScalarString
. These are all subclasses of ScalarString
that handles the attachment of anchor for round-trip preservation.
SclarString is a subclass of str
, which makes your output contain value
if you inspect internal_dictionary
.
So what you can do is e.g. test using isinstance(internal_dictionary['Key'], ruamel.yaml.scalarstring.DoubleQuotedScalarstring)
, or you can test on the 'style' attribute:
if internal_dictionary['Key'].style == '"':