- blogs:
- cles::blog
2021/01/04

PyYAML の dump がちょっと変?

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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . Windows 10 で勝手にログアウトされないようにする(1051)
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(929)
3 . Flash Player projector を使って .swf をスタンドアローンで再生する(823)
4 . RDP のプロトコルを TCP だけに変更する(776)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(699)
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(929)
3 . Flash Player projector を使って .swf をスタンドアローンで再生する(823)
4 . RDP のプロトコルを TCP だけに変更する(776)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(699)
cles::blogについて
Referrers