3

Any yaml libraries in Python that support dumping of long strings as blockliters or folded blocks? に記載されているように、折り畳まれた文字列、リテラル文字列の代表者を追加しました。. また、ダンプされた yaml コンテンツにリストをブロック スタイルで出力するために、representer を追加しました。

しかし問題は、文字列が空の場合、つまり "" またはリストが空の場合、ダンプされた YAML コンテンツで非ブロック スタイルで表示されることです。

pyyaml ダンパーに ">" または "|" を含む "" 空の文字列を強制的に出力させるにはどうすればよいですか? 生成された YAML コンテンツのブロック スタイルで、flow_style=False のスタイルと空のリスト?

4

1 に答える 1

5

少し調査した結果、Pyyaml を使用して、空の文字列をブロック リテラル ('|>' のスタイル) として YAML ファイルにダンプすることができました。私の作品は、ブロック リテラルまたは折り畳まれたブロックとして長い文字列のダンプをサポートする Python の yaml ライブラリはありますか?に部分的に基づいています。.

import yaml
from yaml.emitter import Emitter, ScalarAnalysis

class MyEmitter(Emitter):  
    def analyze_scalar(self, scalar):   
        # Empty scalar is a special case.
        # By default, pyyaml sets allow_block=False
        # I override this to set allow_block=True
        if not scalar:         
            return ScalarAnalysis(scalar=scalar, empty=True, multiline=False,
                allow_flow_plain=False, allow_block_plain=True,
                allow_single_quoted=True, allow_double_quoted=True,
                allow_block=True)   
        return super(MyEmitter, self).analyze_scalar(scalar)

# And I subclass MyDumper from MyEmitter and yaml.Dumper        
class MyDumper(yaml.Dumper, MyEmitter):
    pass
class folded_unicode(unicode): pass
class literal_unicode(unicode): pass

def folded_unicode_representer(dumper, data):
    return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>')
def literal_unicode_representer(dumper, data):
    return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')

yaml.add_representer(folded_unicode, folded_unicode_representer)
yaml.add_representer(literal_unicode, literal_unicode_representer)

# I test it now
d = {'foo': {'folded': folded_unicode(''), 'literal': literal_unicode('')}}
print yaml.dump(d, Dumper=MyDumper)

出力:

foo:
  folded: >
  literal: |

ただし、空のリストをブロック スタイルでダンプする方法が見つかりません。このために、yaml/emitter.py をいじってみたところ、ブロック スタイルでダンプするには空でないリストが必要であることがわかりました。

とにかく、この努力は無駄にはなりませんでした。むしろ非常に刺激的でした:) 誰かがこれを役に立つと思ったり、何かを共有したりできることを願っています.

于 2012-06-04T21:11:54.090 に答える