1. 程式人生 > >ConfigParser中的items方法raw和vars引數

ConfigParser中的items方法raw和vars引數

最近在學習Python,學習到讀取配置檔案這一項。

對ConfigParser中的items方法的後兩個引數非常疑惑,遂help()

>>> help(cfg.items)
Help on method items in module ConfigParser:

items(self, section, raw=False, vars=None) method of ConfigParser.ConfigParser instance
    Return a list of tuples with (name, value) for each option
    in the section.
    
    All % interpolations are expanded in the return values, based on the
    defaults passed into the constructor, unless the optional argument
    `raw' is true.  Additional substitutions may be provided using the
    `vars' argument, which must be a dictionary whose contents overrides
    any pre-existing defaults.
    
    The section DEFAULT is special.

然後,還是看不懂ORZ~

得了,自己實驗吧!得出了一些結果,在這裡記錄,也供他人蔘考,如有不對之處,還望各路大神斧正指點。

首先,新建一個配置檔案

#實驗用配置檔案

[change]
canChange = %(person)s is very good ;格式%(可替換的值)型別,比如string為s

可以看到,在change下有一個key為canChange。

canChange中,使用%替換一個名為person的key。

我們知道,如果[change]中或者[DEFAULT]中存在person則”%(person)“會被替換,但是配置檔案中並沒有提供這個person。

然後,編碼讀取這個配置檔案

# -*- coding:utf-8 -*-
import ConfigParser

cfg = ConfigParser.ConfigParser()
cfg.read('D:/WORKTEST/Python/testConfig.txt')#讀取配置檔案

sessionList = cfg.sections ()

for se in sessionList:
    print se

    #print cfg.items(se) #直接報錯
    print cfg.items(se,1,{'person':'cty'})
    print cfg.items(se,0,{'person':'cty'})
    print cfg.items(se,0,{'human':'cty'})
輸出:

==================== RESTART: D:\WORKTEST\Python\test.py ====================
change
[('canchange', '%(person)s is very good'), ('person', 'cty')]
[('canchange', 'cty is very good'), ('person', 'cty')]


Traceback (most recent call last):
  File "D:\WORKTEST\Python\test.py", line 15, in <module>
    print cfg.items(se,0,{'human':'cty'})
  File "C:\WORK\Python\python27\lib\ConfigParser.py", line 655, in items
    for option in options]
  File "C:\WORK\Python\python27\lib\ConfigParser.py", line 669, in _interpolate
    option, section, rawval, e.args[0])
InterpolationMissingOptionError: Bad value substitution:
section: [change]
option : canchange
key    : person
rawval : %(person)s is very good

分析:

可以看到,for迴圈中有5個print:

第一個print輸出session的名稱,即change

第二個print被註釋了,因為其執行直接報錯,找不到需要替換的person

第三個print,items中 -- raw引數為1(也就是true) ; vars為{'person':'cty'} ; 輸出[('canchange', '%(person)s is very good'), ('person', 'cty')]

表明,在raw為true的情況下,忽略%的替換語法,直接輸出

第四個print,items中 -- raw引數為0(也就是false) ; vars為{'person':'cty'} ;輸出[('canchange', 'cty is very good'), ('person', 'cty')]

表明,在raw為false的情況下,vars中包含要替換的key,%語法中的內容被替換

第五個print,不用解釋了吧,不存在可替換的person而是什麼human,自然報錯了

到此,大致弄清楚了這兩個引數的功用