python最新版3.11正式发布,有哪些新特色?(1/5)
python最新版3.11正式发布,有哪些新特色?(2/5)
python最新版3.11正式发布,有哪些新特色?(3/5)
python最新版3.11正式发布,有哪些新特色?(4/5)
TOML 是 Tom’s Obvious Minimal Language的首字母缩写,是最近十几年比较流行的配置文件格式,用于指定python程序包和项目所要选择的元数据(metadata);TOML的设计不仅便于阅读也便于计算机解析。python 区已经采用这种配置文件格式十多年了,只是在python 3.11版开始正式引入python系统,即tomllib库成为标准库,该库是基于第三方库tomli而构建的。
python配置及其配置文件
player_x_color = blueplayer_o_color = greenboard_size = 3server_url = https://tictactoe.example.com/
以上配置文件中,这些值在概念上来讲是不同的,颜色赋予某一个值,那么在这款游戏中这些值是可以改变的,而无需修改源代码。但是玩这款游戏是在3*3的格子中,那这个值尽管逻辑上可以改变,但不一定有效,所以配置文件中的各项内容要符合游戏场景。下面看一个更复杂一点的例子:
[user]player_x_color = blueplayer_o_color = green[constant]board_size = 3[server]url = https://tictactoe.example.com
TOML是一种相对比较新的配置文件格式
TOML是一种比较新的配置文件格式,其第一个文件标准于2013年发布,其特点是内容项清晰、文件小且便于阅读。现在越来越多的python程序采用这一格式文件来编写和记录配置信息,大多数常用的编程语言都提供了这种配置文件的解析工具。按照TOML格式文件的要求,可以把前文中的配置信息写成如下:
[user]player_x.color = "blue"player_o.color = "green"[constant]board_size = 3[server]url = "https://tictactoe.example.com"
最大的变化是,给字符赋值加了引 “ ”,其他的内容项没有差别。TOML格式的配置文件并不能像JSON或YAML格式文件实现数据序列化,其在三个方面有严格的要求:
- 所有的键都被解析为字符串,因此键不能使用数字;
- TOML没有null类型;
- 不同的内容项之间要留空行。
TOML配置格式文件的语法
如前面提到的tictactoe游戏的配置文件中,包含了服务器的URL信息,这是必须的配置信息,在编写TOML文件之前首先要考虑应用程序或系统的实际运行环境和场景。对于简单的应用程序来说,可以人工检查配置文件信息的有效性,如python 3.10版中的结构化形态匹配方案(structural pattern matching),假定配置文件信息已经被python解析并命名为config,那么就可以检查解析后的结构,如下:
match config: case { "user": {"player_x": {"color": str()}, "player_o": {"color": str()}}, "constant": {"board_size": int()}, "server": {"url": str()}, }: pass case _: raise ValueError(f"invalid configuration: {config}")
其中有两个 case 语句,第一个给出了符合要求的配置信息,即可判定解析结果config是匹配的,可以使用 pass 语句,继续运行代码,否则就会给出 错信息。但是这种方法对比较复杂的TOML文件不适合,特别是需要提供更好更多的 错信息的情况,这种情况下使用 pydantic 比较好,这是一个在运行时标注类型从而检查配置信息是否有效的工具,其最大的优点是简洁、可使用python内置的 错信息。
了解TOML内容项的的键-值对(key-Value Pairs)
TOML配置文件中的每一项内容都是一对键-值,被解析为hash table 数据结构,TOML的值有如下类型:
下面看一个比较综合的TOML的例子,文件名units.toml:
# units.toml[second]label = { singular = "second", plural = "seconds" }aliases = ["s", "sec", "seconds"][minute]label = { singular = "minute", plural = "minutes" }aliases = ["min", "minutes"]multiplier = 60to_unit = "second"[hour]label = { singular = "hour", plural = "hours" }aliases = ["h", "hr", "hours"]multiplier = 60to_unit = "minute"[day]label = { singular = "day", plural = "days" }aliases = ["d", "days"]multiplier = 24to_unit = "hour"[year]label = { singular = "year", plural = "years" }aliases = ["y", "yr", "years", "julian_year", "julian years"]multiplier = 365.25to_unit = "day"
该文件包括几个部分,每个部分的名称用方括 作为标题行,每一部分称为TOML文件中的表,表中包含多个键-值对,表中可以再嵌入表。以上这个例子中的每个表,除了[second],都有相同的结构,并且都有四个键:label、aliases、multiplier和to_unit;与键相对应的值可以是不同的数据类型。上例中有以下四种类型:
- label 是内联表,类似于python中的词典类型;
- aliases 是数组,类似于python中的列表;
- multipliers 是数字,可以是整数,可以是浮点数;
- to_unit 是字符串。
当然,TOML能支持的数据类型不仅仅是以上四类,也支持布尔类型和日期类型。
TOML文件可以使用 tomllib 库来读取其中的信息,示例代码如下:
import tomllibwith open("units.toml", mode="rb") as file: units = tomllib.load(file)units# {'second': {'label': {'singular': 'second', 'plural': 'seconds'}, ... }}
其中读取模式 mode = “rb” 参数,表示必须以二进制方式打开;另外,还可以用 tomllib.loads() 解析字符串,示例代码如下:
import tomllibimport pathlibunits = tomllib.loads( pathlib.Path("units.toml").read_text(encoding="utf-8") )units# {'second': {'label': {'singular': 'second', 'plural': 'seconds'}, ... }}
注意以上两个示例代码中分别使用了 load() 函数和loads()函数。其中的 units 是一个内嵌的词典类型,因此 tomllib 把 TOML 文件解析为python的词典类型。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!