ページ

2017年12月21日木曜日

PythonでYAMLを読むときコロンのところでエラーが起きる理由

PyYAML では
a: k='xxx: yyy'
といった入力は xxx: のコロンのところでエラーyaml.scanner.ScannerError: mapping values are not allowed here が起きる。
a: "k='xxx: yyy'"
と書くか、折りたたみ形式で
a: >
    k='xxx: yyy'
のように書けばこのエラーは起こらない。

これがPythonでコードを書いている時はよいのだが、Ansibleで
    - name: test
      lineinfile: dest=/path/to/file state=present regexp='^# setting:' line='# setting: 192.168.1.1'
のような書き方をすると line='# setting: 192.168.1.1' の : で ERROR: Syntax Error while loading YAML scriptといったわかりにくいエラーが起こる。

じつは内部ではPyYAML でのパース処理の関係で yaml.scanner.ScannerError: mapping values are not allowed here が出ているはず。

これを 折りたたみスタイルにすればエラーが出ない。
    - name: test
      lineinfile: >
        dest=/path/to/file state=present regexp='^# setting:' line='# setting: 192.168.1.1'
読みやすさを考慮して適度に折り返すと、このように
    - name: test
      lineinfile: >
        dest=/path/to/file state=present 
        regexp='^# setting:' 
        line='# setting: 192.168.1.1'
と書くが、じつはこれは無意識にエラーを回避していることになっている。

コロンのところでエラーになるのは、YAMLの文法上、ダブルクオートで括って書かなくても、自動的に文字列として扱ってくれるが、括られていないと、最初にトークン分割したとき
a」 「: 」 「k='xxx」「: 」 「yyy'
という形になってしまうため、このようなエラーになるのだろう。

1 件のコメント: