>>> from env_helper import info; info()
页面更新时间: 2023-12-27 09:29:37
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

4.5. 深入掌握ConfigParser

几乎所有的应用程序真正运行起来的时候都会有传入的参数,这些参数有时会通过一个或几个配置文件存储。 参数或配置文件的意义在于用户不需要修改程序代码,就可以改变应用程序的行为,让它更好地为应用服务。 比如 pytint 就带有一个参数 --rcfile 用以指定配罝文件,实现对定义代码风格的检测。

常见的配置文件格式有 .xml.ini 等,其中在MS Windows系统上 .ini 文件格式用得尤其多, 甚至操作系统的API也都提供了相关的接口函数来支持它。 类似 .ini 的文件格式在Linux 等操作系统中也是极常用的,比如 pylint 的配置文件就是这个格式。 Python 3中有个标准库来这种格式的文件读写与处理,名称为 configparser

在 Python 2 中这个模块名称为 `ConfigParser` 。

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

[sectioxil ] optionl=0

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

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

举个例子,有如下配置文件:

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

簡单地编写一段程序尝试通过sectionl获取in default的值()

$ cat readini.py

import ConfigParser conf = ConfigParser-ConfigParser () conf.read('example.conf') print (conf.get('section1', 'in—default'))

>>> import configparser
>>> conf = configparser.ConfigParser ()
>>> conf.read( 'example.conf ' )
>>>
>>> conf.sections()
['section']
>>> conf.get('section', 'addr')
"'test'"

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

  1. 如果找不到节名,就抛出NoSectionEnror。

  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/'

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

$ cat format.conf [DEFAULT] conn_sti:= % (dbn) s://% (user) s: % (pw) s@% (host) s r % (port> s/% (db) s dbn = mysql user - root host=localhost port = 3306

[dbl]

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 ( 'dbl ’ , ' conn_str ' )) print( conf.get ('db2' ,'conn_str'))

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

$ python readformatini.py mysql :ffa.aa: ppp@localhost: 3306/example mysql ://root :www0192.16S . 0»110 : 3306/example

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