the*_*orn 6 python yaml ruamel.yaml
下面的代码:
from ruamel.yaml import YAML
import sys, textwrap
yaml = YAML()
yaml.default_flow_style = False
yaml.dump({
'hello.py': textwrap.dedent("""\
import sys
sys.stdout.write("hello world")
""")
}, sys.stdout)
Run Code Online (Sandbox Code Playgroud)
产生:
hello.py: "import sys\nsys.stdout.write(\"hello world\")\n"
Run Code Online (Sandbox Code Playgroud)
有没有办法让它产生:
hello.py: |
import sys
sys.stdout.write("hello world")
Run Code Online (Sandbox Code Playgroud)
反而?
版本:
python: 2.7.16 on Win10 (1903)
ruamel.ordereddict==0.4.14
ruamel.yaml==0.16.0
ruamel.yaml.clib==0.1.0
Run Code Online (Sandbox Code Playgroud)
如果您加载然后转储预期的输出,您会发现ruamel.yaml实际上可以保留块样式文字标量。
import sys
import ruamel.yaml
yaml_str = """\
hello.py: |
import sys
sys.stdout.write("hello world")
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
Run Code Online (Sandbox Code Playgroud)
因为这再次给出了加载的输入:
hello.py: |
import sys
sys.stdout.write("hello world")
Run Code Online (Sandbox Code Playgroud)
要了解它是如何工作的,您应该检查多行字符串的类型:
print(type(data['hello.py']))
Run Code Online (Sandbox Code Playgroud)
打印:
<class 'ruamel.yaml.scalarstring.LiteralScalarString'>
Run Code Online (Sandbox Code Playgroud)
这应该为您指明正确的方向:
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import LiteralScalarString
import sys, textwrap
def LS(s):
return LiteralScalarString(textwrap.dedent(s))
yaml = ruamel.yaml.YAML()
yaml.dump({
'hello.py': LS("""\
import sys
sys.stdout.write("hello world")
""")
}, sys.stdout)
Run Code Online (Sandbox Code Playgroud)
它还输出你想要的内容:
hello.py: |
import sys
sys.stdout.write("hello world")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2606 次 |
| 最近记录: |