2017-09-06 4 views
0

Je suis en train d'analyser le fichier YAML suivant:Définition avec docstrings dans un fichier YAML: erreurs d'analyse

\- api: 

    api_first: """this is some docstring """ 

Je veux essentiellement utiliser les triples guillemets et ont des déclarations en leur sein. Mais quand j'utilise la bibliothèque yaml il jette quelques erreurs pour moi

In [1]: import yaml 

In [2]:with open('new.yaml') as f: 
...:  dataMap = yaml.safe_load(f) 
--------------------------------------------------------------------------- 
ParserError        Traceback (most recent call last) 
<ipython-input-2-2266b3e8606a> in <module>() 
    1 
    2 with open('new.yaml') as f: 
    ----> 3  dataMap = yaml.safe_load(f) 
/phaedrus/home/skorada/lib/python3.5/site- 
packages/yaml/parser.py in parse_block_sequence_entry(self) 
391    token = self.peek_token() 
392    raise ParserError("while parsing a block collection", 
self.marks[-1], 
--> 393      "expected <block end>, but found %r" % token.id, 
token.start_mark) 
394   token = self.get_token() 
395   event = SequenceEndEvent(token.start_mark, token.end_mark) 

ParserError: while parsing a block collection 
in "new.yaml", line 1, column 1 
expected <block end>, but found '?' 
in "new.yaml", line 2, column 1 

Vraiment pas sûr de ce que la question est?

Répondre

1

Il n'y a pas de guillemets dans YAML. Votre scalaire peut être un guillemet simple, un guillemet double, un guillemets non-cités, ou un littéral ou un pli (en bloc).

Si vous voulez imiter les cordes triples guillemets de Python et vous n'avez pas de caractères de contrôle qui ont besoin de s'échapper (ceux-ci ne comprennent pas le caractère de saut de ligne), vous pouvez utiliser le style bloc scalaires littéral:

api: 

    api_first: | 
    this is some docstring 
    with newlines after each line 

. Si vous avez des caractères de contrôle, vous devez utiliser des scalaires à guillemets doubles dans YAML et avoir des retours à la ligne comme \n ou comme des doubles lignes dans les guillemets doubles.

Votre """this is some docstring """ est interprété comme trois scalaires sur une ligne ("", "this is some docstring " et "") et ce n'est pas valide YAML.

Je suppose que le début \ dans votre YAML est une faute de frappe.

+0

Salut Anthon, Merci d'avoir répondu. Je pense que j'essayais un multi-ligne. Cela peut être résolu en utilisant "|" et ça a marché pour moi. – skorada

+0

C'est le «scalaire littéral de type bloc» que j'ai indiqué dans ma réponse. J'aurais dû inclure un exemple. – Anthon