python最新版3.11正式发布,有哪些新特色?(5/5)

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格式文件实现数据序列化,其在三个方面有严格的要求:

  1. 所有的键都被解析为字符串,因此键不能使用数字;
  2. TOML没有null类型;
  3. 不同的内容项之间要留空行。

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的值有如下类型:

  • String,字符串类型
  • Integer, 整数类型
  • Float,浮点数类型
  • Boolean,布尔类型
  • offset date-time,日期时间偏移
  • Local date-time,当地日期时间
  • Local date,当地日期
  • Local time,当地时间
  • Array,数组类型
  • inline table, 内联表
  • 下面看一个比较综合的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;与键相对应的值可以是不同的数据类型。上例中有以下四种类型:

    1. label 是内联表,类似于python中的词典类型;
    2. aliases 是数组,类似于python中的列表;
    3. multipliers 是数字,可以是整数,可以是浮点数;
    4. 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进行处理,非常感谢!

    上一篇 2022年10月8日
    下一篇 2022年10月8日

    相关推荐