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

news2024/11/15 10:34:05

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

  • 0 yaml文档
  • 1 yaml.scan()
  • 2 yaml.parse()
  • 3 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'))])]))])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生信分析案例 Python简明教程 | 视频15

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

怎样修改LED显示屏的显示内容

每个LED显示屏通常都附带配套的控制卡和相应的管理软件。安装完LED显示屏后,只需连接控制卡和电源,并通过运行管理软件,便能轻松地更换LED显示屏的显示内容。 更改LED显示屏内容非常便捷,我们可以使用电脑、手机或者U盘等设备进行…

html实现蜂窝菜单

效果图 CSS样式 keyframes _fade-in_mkmxd_1 {0% {filter: blur(20px);opacity: 0}to {filter: none;opacity: 1} } keyframes _drop-in_mkmxd_1 {0% {transform: var(--transform) translateY(-100px) translateZ(400px)}to {transform: var(--transform)} } ._examples_mkmx…

layui各种事件无效(例如表格重载或 分页插件按钮失效)的解决方法

下图是我一个系统的操作日志,在分页插件右下角嵌入了一个导出所有数据的按钮 ,代码没有任何问题,点击导出按钮却失效 排查之后,发现表格标签table定义了ID又定义了lay-filter,因我使用的layui从2.7.6升级到2.8.11&…

JMeter接口测试:BeanShell实现接口的加密和解密

前些天用JMeter写了一个接口的自动化脚本,请求参数加密和响应数据解密都覆盖到了,中间涉及了BeanShell脚本编写和导入jar包的一些方法,想着挺有代表性的,分享给大家,希望对大家的接口自动化测试有所启发。 这是一个注册…

简化Java单元测试数据

用EasyModeling简化Java单元测试 EasyModeling 是我在2021年圣诞假期期间开发的一个 Java 注解处理器,采用 Apache-2.0 开源协议。它可以帮助 Java 单元测试的编写者快速构造用于测试的数据模型实例,简化 Java 项目在单元测试中准备测试数据的工作&…

半路杀出个“程咬金”,谁在吹响智能化供应链重构号角

汽车智能化的竞争,不再是平行模式(车企与车企、Tier1与Tier1),也不再是一边倒的车企自研模式,更不是纯粹的B2C模式。 随着昨天大众集团对外官宣与小鹏、上汽的深度合作启动,围绕电动化、智能化的竞争无疑进…

PHP注册、登陆、6套主页-带Thinkphp目录解析-【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册,登陆 phpStudy 设置导数据库项目目录如图:代码部分:控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…

Talk | 南洋理工大学博士后研究员李祥泰:基于Transformer的视觉分割模型总结、回顾与展望

​ 本期为TechBeat人工智能社区第517期线上Talk! 北京时间7月27日(周四)20:00,南洋理工大学博士后研究员—李祥泰的Talk已经准时在TechBeat人工智能社区开播了! 他与大家分享的主题是: “基于Transformer的视觉分割模型总结、回顾与展望”&am…

无涯教程-jQuery - animate()方法函数

animate()方法执行一组CSS属性的自定义动画。 animate( params, [duration, easing, callback] ) - 语法 selector.animate( params, [duration, easing, callback] ); 这是此方法使用的所有参数的说明 params - 动画将朝其移动的CSS属性图。duration - 这是可选…

idea常用技巧/idea常见问题

idea常见问题 idea全局搜索默认只显示100条解决方案 如上图,每次搜索时只显示100条,没法展示全。因版本的不同,配置也有些差异,以下也是经过各种搜索整理出了两个方案来解决这个问题。 方案一: 快捷键Ctrl shift a…

windows环境启动redis-server.exe出现闪退问题解决方案(亲测有效)

现象 windows环境下,启动redis-server.exe,出现闪退现象 解决方案 在你的redis解压目录下,新建一个start.bat文件 在start.bat文件里面写上这一句话: redis-server.exe redis.windows.conf然后保存,后面启动redis…

网络安全/信息安全—学习笔记

一、网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

【暑期每日一练】 day7

目录 选择题 (1) 解析: (2) 解析: (3) 解析: (4) 解析: (5) 解析: 编程题 题一…

​LeetCode解法汇总2500. 删除每行中的最大值

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。 执行下述操作…

方差分析学习

有时候能看的下去,有时候看书看不下去。 为了加深理解和记忆,先把基础的内容记忆一下。 组内方差(误差平方和)和组间方差(效应平方和)的定义: 注意:图中红线部分是一个整体。 误差…

基于java SpringBoot和HTML的博客系统

随着网络技术渗透到社会生活的各个方面,传统的交流方式也面临着变化。互联网是一个非常重要的方向。基于Web技术的网络考试系统可以在全球范围内使用互联网,可以在本地或异地进行通信,大大提高了通信和交换的灵活性。在当今高速发展的互联网时…

Quartz实战:基于Quartz实现定时任务的动态调度,实现定时任务的增删改查

文章目录 一、Quartz基础二、使用Quartz实现定时任务的动态调度1、使用Quartz-jobStore 持久化2、前端页面实现效果图3、自定义job表4、增删改查Controller5、Quartz工具类6、测试任务类7、springboot启动初始化定时任务8、自定义JobFactory,使Task注册为Bean9、省略…

PoseiSwap 即将开启质押,利好刺激下 POSE通证短时涨超 30%

随着Nautilus Chain主网的上线,预示着Web3世界迎来全新的模块化、Layer3时代,为Web3世界与Web2世界的深入融合构建基础。而PoseiSwap作为Nautilus Chain上的首个DEX,也成为了加密行业首个以模块化为基础构建的DEX。 基于Nautilus Chain&#…

免费商城搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c 手机商城免费搭建

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…