YAML+PyYAML笔记 6 | PyYAML源码之yaml.scan(),yaml.parse(),yaml.compose()

6 | PyYAML源码之yaml.scan,yaml.parse, yaml.compose

0 yaml文档

  • 以下示例来源于网络,便于后续学习用, 文档为config_yaml.yaml。
{
    name: John Doe,
    age: 28,
    hobbies: [hiking, cooking, fishing],
    address:
        {
            city: New York,
            state: NY,
            street: 100 Main St,
            location:
                {
                 longitude: 40.712776,
                 latitude: -74.005974
                }
        },
    family:
        [
            {
                name: Jane,
                age: 25,
                relation: spouse
            },
            {
                name: Joe,
                age: 3,
                relation: son
            }
        ]
}

1 yaml.scan()

  • 源码:
    在这里插入图片描述
  • 作用:对给定的stream,生成一个tokens序列;

由于在yaml与其他对象互相转化的过程中,yaml是要经过若干个逻辑阶段,所以yaml中有events和tokens序列的概念。

  • 解析:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/28 
# 文件名称:pyyaml_scan.py
# 作用:pyyaml源码学习
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import yaml

document = """
---
{
    name: John Doe,
    age: 28,
    hobbies: [hiking, cooking, fishing],
    address:
        {
            city: New York,
            state: NY,
            street: 100 Main St,
            location:
                {
                 longitude: 40.712776,
                 latitude: -74.005974
                }
        },
    family:
        [
            {
                name: Jane,
                age: 25,
                relation: spouse
            },
            {
                name: Joe,
                age: 3,
                relation: son
            }
        ]
}
"""

for token in yaml.scan(document):
    print(token)
  • 输出:
StreamStartToken(encoding=None)
DocumentStartToken()
FlowMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='name')
ValueToken()
ScalarToken(plain=True, style=None, value='John Doe')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='age')
ValueToken()
ScalarToken(plain=True, style=None, value='28')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='hobbies')
ValueToken()
FlowSequenceStartToken()
ScalarToken(plain=True, style=None, value='hiking')
FlowEntryToken()
ScalarToken(plain=True, style=None, value='cooking')
FlowEntryToken()
ScalarToken(plain=True, style=None, value='fishing')
FlowSequenceEndToken()
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='address')
ValueToken()
FlowMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='city')
ValueToken()
ScalarToken(plain=True, style=None, value='New York')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='state')
ValueToken()
ScalarToken(plain=True, style=None, value='NY')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='street')
ValueToken()
ScalarToken(plain=True, style=None, value='100 Main St')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='location')
ValueToken()
FlowMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='longitude')
ValueToken()
ScalarToken(plain=True, style=None, value='40.712776')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='latitude')
ValueToken()
ScalarToken(plain=True, style=None, value='-74.005974')
FlowMappingEndToken()
FlowMappingEndToken()
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='family')
ValueToken()
FlowSequenceStartToken()
FlowMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='name')
ValueToken()
ScalarToken(plain=True, style=None, value='Jane')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='age')
ValueToken()
ScalarToken(plain=True, style=None, value='25')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='relation')
ValueToken()
ScalarToken(plain=True, style=None, value='spouse')
FlowMappingEndToken()
FlowEntryToken()
FlowMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='name')
ValueToken()
ScalarToken(plain=True, style=None, value='Joe')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='age')
ValueToken()
ScalarToken(plain=True, style=None, value='3')
FlowEntryToken()
KeyToken()
ScalarToken(plain=True, style=None, value='relation')
ValueToken()
ScalarToken(plain=True, style=None, value='son')
FlowMappingEndToken()
FlowSequenceEndToken()
FlowMappingEndToken()
StreamEndToken()

2 yaml.parse()

  • 源码:
    在这里插入图片描述
  • 作用:parse对给定的yaml stream,生成一个events序列;

由于在yaml与其他对象互相转化的过程中,yaml是要经过若干个逻辑阶段,所以yaml中有events和tokens序列的概念。

  • 解析:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/28 
# 文件名称:pyyaml_parse.py
# 作用:yaml.parse()
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import yaml

document = """
---
{
    name: John Doe,
    age: 28,
    hobbies: [hiking, cooking, fishing],
    address:
        {
            city: New York,
            state: NY,
            street: 100 Main St,
            location:
                {
                 longitude: 40.712776,
                 latitude: -74.005974
                }
        },
    family:
        [
            {
                name: Jane,
                age: 25,
                relation: spouse
            },
            {
                name: Joe,
                age: 3,
                relation: son
            }
        ]
}
"""

for event in yaml.parse(document):
    print(event)
  • 输出:
StreamStartEvent()
DocumentStartEvent()
MappingStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='name')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='John Doe')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='age')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='28')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='hobbies')
SequenceStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='hiking')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='cooking')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='fishing')
SequenceEndEvent()
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='address')
MappingStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='city')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='New York')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='state')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='NY')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='street')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='100 Main St')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='location')
MappingStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='longitude')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='40.712776')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='latitude')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='-74.005974')
MappingEndEvent()
MappingEndEvent()
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='family')
SequenceStartEvent(anchor=None, tag=None, implicit=True)
MappingStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='name')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='Jane')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='age')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='25')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='relation')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='spouse')
MappingEndEvent()
MappingStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='name')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='Joe')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='age')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='3')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='relation')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='son')
MappingEndEvent()
SequenceEndEvent()
MappingEndEvent()
DocumentEndEvent()
StreamEndEvent()

3 yaml.compose()

  • 源码:
    在这里插入图片描述
  • 作用:解析流中的第一个YAML文档,并产生相应的表示树;
  • 解析:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/28 
# 文件名称:pyyaml_compose.py
# 作用:yaml.compose()
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import yaml

document = """
---
{
    name: John Doe,
    age: 28,
    hobbies: [hiking, cooking, fishing],
    address:
        {
            city: New York,
            state: NY,
            street: 100 Main St,
            location:
                {
                 longitude: 40.712776,
                 latitude: -74.005974
                }
        },
    family:
        [
            {
                name: Jane,
                age: 25,
                relation: spouse
            },
            {
                name: Joe,
                age: 3,
                relation: son
            }
        ]
}
"""

tree = yaml.compose(document)
print(tree)
  • 输出:
MappingNode(tag='tag:yaml.org,2002:map', value=
[(ScalarNode(tag='tag:yaml.org,2002:str', value='name'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='John Doe')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='age'), 
ScalarNode(tag='tag:yaml.org,2002:int', value='28')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='hobbies'), 
SequenceNode(tag='tag:yaml.org,2002:seq', value=
[ScalarNode(tag='tag:yaml.org,2002:str', value='hiking'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='cooking'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='fishing')])), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='address'), 
MappingNode(tag='tag:yaml.org,2002:map', value=
[(ScalarNode(tag='tag:yaml.org,2002:str', value='city'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='New York')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='state'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='NY')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='street'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='100 Main St')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='location'), 
MappingNode(tag='tag:yaml.org,2002:map', value=
[(ScalarNode(tag='tag:yaml.org,2002:str', value='longitude'), 
ScalarNode(tag='tag:yaml.org,2002:float', value='40.712776')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='latitude'), 
ScalarNode(tag='tag:yaml.org,2002:float', value='-74.005974'))]))])), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='family'), 
SequenceNode(tag='tag:yaml.org,2002:seq', value=
[MappingNode(tag='tag:yaml.org,2002:map', value=
[(ScalarNode(tag='tag:yaml.org,2002:str', value='name'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='Jane')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='age'), 
ScalarNode(tag='tag:yaml.org,2002:int', value='25')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='relation'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='spouse'))]), 
MappingNode(tag='tag:yaml.org,2002:map', value=
[(ScalarNode(tag='tag:yaml.org,2002:str', value='name'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='Joe')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='age'), 
ScalarNode(tag='tag:yaml.org,2002:int', value='3')), 
(ScalarNode(tag='tag:yaml.org,2002:str', value='relation'), 
ScalarNode(tag='tag:yaml.org,2002:str', value='son'))])]))])
posted @ 2023-07-28 13:27  虫无涯  阅读(10)  评论(0编辑  收藏  举报  来源