likes
comments
collection
share

Python 服务需要使用配置文件?最好别自定义格式,请使用 configparser

作者站长头像
站长
· 阅读数 14

背景

我开发过《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋象棋等游戏。

我的后台WebSocket服务是用Python开发的。其实我这4个游戏的后台代码一模一样,是同一套代码。唯一不同的是配置文件不同,因为我要通过读配置文件,知道当前的游戏的key是什么,从而方便写入正确的日志。

其实很多时候,我们都需要使用配置文件,它的特点是:修改方便,无需理解代码,即可修改。

不知道configparser的开发者,可能会自定义一种数据结构,例如json、xml等,来定义配置文件等格式。其实这完全没有必要。Python标准库configparser提供了更加方便更加强大的功能,完全不需要任何额外依赖。

配置文件诉求

配置文件有些特点:

  1. 人工写入,人工确保格式正确性。
  2. 代码读取,需要理解配置文件的格式。
  3. 不同的配置,可能数据类型不同,常见的有str、有int、有float、有bool。
  4. 一些项目没定义,可能需要默认值(fallback)。

这些问题,configparser都有解决方案。

configparser介绍

配置文件格式与 Microsoft Windows INI 文件类似。

官方文档提供的例子,是个很好的学习案例,如下:

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no
>>> config = configparser.ConfigParser()
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
>>> config['bitbucket.org']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> config['topsecret.server.com']['Port']
'50022'
>>> config['bitbucket.org']['ForwardX11']
'yes'

通过上面几个典型的例子,你应该能看得出一些门道:

  • 配置文件通过[]分组,通过configparser访问时,需要先指明要访问的分组,再指明要访问的key。
  • DEFAULT是一个特殊的分组,表示默认值。如果尝试访问其它分组中不存在的key,而key存在于DEFAULT分组,那么就会使用默认值。
  • 所有类型,直接访问时,都是字符串类型。开发者需要做类型转换。详见下面内容。

更方便的类型转换

对于bool而言,类型转换比较麻烦。因为有人配置文件用on off,有人用yes no,有人用1 0,有人用true false,而且可能大小写还有差别。

这时候configparser的类型转换功能就派上用场了。通过getboolean方法,它可以自动识别上述常见的表示bool配置的英文(大小写不敏感),自动转换为True False。例如可以这样用:

>>> config['bitbucket.org'].getboolean('ForwardX11')
True
>>> config.getboolean('bitbucket.org', 'Compression')
True

此外,类似的方法还有getintgetfloat

我们不需要getstr,是因为get本身就返回字符串类型。

写在最后

以上就是configparser库的基本内容了,已经能够满足我的日常使用。如果你想了解更多,可以阅读官方文档

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,联系我,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋象棋等游戏,不收费无广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这2个专栏里分享:《教你做小游戏》《极致用户体验》