BLOGTIMES
2021/01/04

PyYAML の dump がちょっと変?

  python 
このエントリーをはてなブックマークに追加

PyYAMLを使っていたら思わぬところでハマってしまったのでメモ。
例えば以下のように value の文字列に { } が入っているような場合でも、dump() したときに文字列がクオートされないようなんですよね。

$ pip list | grep PyYAML PyYAML 5.3.1 $ python Python 3.6.12 (default, Dec 26 2020, 15:27:21) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import yaml >>> d = {"a": 'b', "b": "aaaaa{abc}"} >>> print(yaml.dump(d, default_flow_style=False, allow_unicode=True, explicit_start=True)) --- a: b b: aaaaa{abc} >>>

これ、何が問題になるかというと、処理系によっては { } がインラインの hash だと解釈されてしまうことがあります。
例えばこのような YAML ファイルを PHP5 の Spyc に入力するとこんな感じのエラーを吐きます。

$ echo '<?php require("/usr/share/pear/spyc.php5"); Spyc::YAMLLoad("--- hoge: aaa{bbb} ");' | php PHP Fatal error: Unsupported operand types in /usr/share/pear/spyc.php5 on line 582 $ echo $? 255

調べてみると ruamel.yaml を使えばよいという話*1もあるようなのですが、動作検証が面倒なの今回は末尾に無害な半角スペースを足すことで回避することにしました。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/12209
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン