返回介绍

建议40:深入掌握 ConfigParser

发布于 2024-01-30 22:19:09 字数 2685 浏览 0 评论 0 收藏 0

几乎所有的应用程序真正运行起来的时候,都会读取一个或几个配置文件。配置文件的意义在于用户不需要修改代码,就可以改变应用程序的行为,让它更好地为应用服务。比如pylint就带有一个参数--rcfile用以指定配置文件,实现对自定义代码风格的检测。常见的配置文件格式有XML和ini等,其中在MS Windows系统上,ini文件格式用得尤其多,甚至操作系统的API也都提供了相关的接口函数来支持它。类似ini的文件格式,在Linux等操作系统中也是极常用的,比如pylint的配置文件就是这个格式。但凡这种常用的东西,Python都有个标准库来支持它,也就是ConfigParser。

ConfigParser的基本用法通过手册可以掌握,但是仍然有几个知识点值得在这里跟大家说一下。首先就是getboolean()这个函数。getboolean()根据一定的规则将配置项的值转换为布尔值,如以下的配置:

[section1]
option1=0

当调用getboolean('section1', 'optioin1')时,将返回False。不过getboolean()的真值规则值得一说:除了0之外,no、false和off都会被转义为False,而对应的1、yes、true和on则都被转义为True,其他值都会导致抛出ValueError异常。这样的设计非常贴心,使得我们能够在不同的场合使用yes/no、true/false、on/off等更切合自然语言语法的词汇,提升配置文件的可维护性。

除了getboolean()之外,还需要注意的是配置项的查找规则。首先,在ConfigParser支持的配置文件格式里,有一个[DEFAULT]节,当读取的配置项在不在指定的节里时,ConfigParser将会到[DEFAULT]节中查找。举个例子,有如下配置文件:

$ cat example.conf 
[DEFAULT]
in_default = 'an option value in default'
 [section1]

简单地编写一段程序尝试通过section1获取in_default的值。

$ cat readini.py 
import ConfigParser
conf = ConfigParser.ConfigParser()
conf.read('example.conf')
print conf.get('section1', 'in_default')

运行结果如下:

$ python readini.py 
'an option value in default'

可见ConfigParser的行为跟上文描述是一致的。不过,除此之外,还有一些机制导致项目对配置项的查找更复杂,这就是class ConfigParser构造函数中的defaults形参以及其get(section, option[, raw[, vars]])中的全名参数vars。如果把这些机制全部用上,那么配置项值的查找规则如下:

1)如果找不到节名,就抛出NoSectionError。

2)如果给定的配置项出现在get()方法的vars参数中,则返回vars参数中的值。

3)如果在指定的节中含有给定的配置项,则返回其值。

4)如果在[DEFAULT]中有指定的配置项,则返回其值。

5)如果在构造函数的defaults参数中有指定的配置项,则返回其值。

6)抛出NoOptionError。

因为篇幅所限,这里就不提供示例了,大家可以自行构造相应的例子来验证。接下来要讲的是第三个特点。大家知道,在Python中字符串格式化可以使用以下语法:

>>> '%(protocol)s://%(server)s:%(port)s/' % { 'protocol':'http', 'server':'example.com', 
    'port':1080}
'http://example.com:1080/'

其实ConfigParser支持类似的用法,所以在配置文件中可以使用。如,有如下配置选项:

$ cat format.conf 
[DEFAULT]
conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s
dbn = mysql
user = root
host=localhost
port = 3306
 [db1]
user = aaa
pw=ppp
db=example
 [db2]
host=192.168.0.110
pw=www
db=example

这是一个很常见的SQLAlchemy应用程序的配置文件,通过这个配置文件能够获取不同的数据库配置相应的连接字符串,即conn_str。如你所见,conn_str定义在[DEFAULT]中,但当它通过不同的节名来获取格式化后的值时,根据不同配置,得到不同的值。先来看以下代码:

$ cat readformatini.py 
import ConfigParser
conf = ConfigParser.ConfigParser()
conf.read('format.conf')
print conf.get('db1', 'conn_str')
print conf.get('db2', 'conn_str')

非常简单的代码,就是通过ConfigParser获取db1和db2两个节的配置。然后看如下输出:

$ python readformatini.py 
mysql://aaa:ppp@localhost:3306/example
mysql://root:www@192.168.0.110:3306/example

可以看到,当通过不同的节名调用get()方法时,格式化conn_str的参数是不同的,这个规则跟上述查找配置项的规则相同。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文