Python 服务需要使用配置文件?最好别自定义格式,请使用 configparser
背景
我开发过《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋、象棋等游戏。
我的后台WebSocket服务是用Python开发的。其实我这4个游戏的后台代码一模一样,是同一套代码。唯一不同的是配置文件不同,因为我要通过读配置文件,知道当前的游戏的key是什么,从而方便写入正确的日志。
其实很多时候,我们都需要使用配置文件,它的特点是:修改方便,无需理解代码,即可修改。
不知道configparser
的开发者,可能会自定义一种数据结构,例如json、xml等,来定义配置文件等格式。其实这完全没有必要。Python标准库configparser
提供了更加方便更加强大的功能,完全不需要任何额外依赖。
配置文件诉求
配置文件有些特点:
- 人工写入,人工确保格式正确性。
- 代码读取,需要理解配置文件的格式。
- 不同的配置,可能数据类型不同,常见的有str、有int、有float、有bool。
- 一些项目没定义,可能需要默认值(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
此外,类似的方法还有getint
和getfloat
。
我们不需要getstr
,是因为get
本身就返回字符串类型。
写在最后
以上就是configparser
库的基本内容了,已经能够满足我的日常使用。如果你想了解更多,可以阅读官方文档。
我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,联系我,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋、象棋等游戏,不收费无广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这2个专栏里分享:《教你做小游戏》、《极致用户体验》。
转载自:https://juejin.cn/post/7158108796089270308