如何为SafeConfigParser设置默认值?

26
我有一个配置文件,如下所示:
[job]
mailto=bob
logFile=blahDeBlah.txt

我想使用 SafeConfigParser 读取配置选项:

values = {} 
config = ConfigParser.SafeConfigParser()
try:
    config.read(configFile)
    jobSection = 'job'

    values['mailto'] = config.get( jobSection, 'mailto' )
    values['logFile'] = config.get( jobSection, 'logFile' )
    # it is not there
    values['nothingThere'] = config.get( jobSection, 'nothingThere' )
.... # rest of code

当然,最后一行会抛出一个错误。我该如何为config.get()方法指定一个默认值?

另一方面,如果我有一个如下的选项文件:

[job1]
mailto=bob
logFile=blahDeBlah.txt

[job2]
mailto=bob
logFile=blahDeBlah.txt

似乎没有办法为job1指定与job2部分中的默认选项不同的默认选项。


这实际上是两个不同的问题。 - Niels Bom
4个回答

23

使用构造函数中的defaults参数:

# class ConfigParser.SafeConfigParser([defaults[, dict_type]]) 
#
config = ConfigParser.SafeConfigParser({'nothingThere': 'lalalalala'})
...
...
# If the job section has no "nothingThere", "lalalalala" will be returned
# 
config.get(jobSection, 'nothingThere')

13
谢谢,我有点困惑,似乎没有办法指定默认的[部分]名称。我今天会尝试一下。 - Martlark
12
我不明白这个回答如何解决问题。如果job1和job2的默认值应该不同怎么办? - CPBL
这实际上不起作用,因为“nothingThere”会自动转换为小写的“nothingthere”。如果您希望选项名称区分大小写,则需要执行config.optionxform = str,然后执行config.set('DEFAULT','nothingThere','lalalalala')。 - timidpueo

22
你还可以使用一个默认的".ini"文件,在读取你的实际配置文件之前先读取它。

default.ini:

[job1]
mailto=jack
logfile=default.log

[job2]
mailto=john
logfile=default.log

config.ini:

[job1]
mailto=sparrow
logfile=blah.log

[job2]
logfile=blah2.log

解析:
import ConfigParser  # For Python 3 use the configparser module instead (all lowercase)

config = ConfigParser.SafeConfigParser()
config.read('default.ini')
config.read('config.ini')

print config.get('job1', 'mailto')
# -> sparrow (from config.ini)

print config.get('job1', 'logfile')
# -> blah.log (from config.ini)

print config.get('job2', 'mailto')
# -> john (from default.ini)

print config.get('job2', 'logfile')
# -> blah2.log (from config.ini)

我认为这是对楼主问题的最佳回答。 - Luke101
@Luke101,当分发软件包时有点尴尬。您必须在软件包数据中分发default.ini,并且需要跳过一些障碍才能在需要时读取它。 - Ben Farmer
@Ben Farmer - 如果是这样的话,你可以将默认的ini文件嵌入到程序中作为一个多行字符串,并将config.read('default.ini')替换为config.read_string(mydefaultstring) - Chris Maurer

18

在 Python 3 中,您可以如下提供一个回退值给 get() 方法:

values['nothingThere'] = config.get('job', 'nothingThere', fallback=0)
print(values['nothingThere'])
# -> 0

1
默认值已由第二个参数提供,我从未见过“fallback”参数。你能指出一些文档吗? - Mad Physicist
1
请注意,这是解析器级别的获取方法,而不是部分的获取方法,因此第二个参数是键,而不是默认值。文档在这里-https://docs.python.org/3/library/configparser.html#fallback-values - Andy White
@MadPhysicist 这取决于您如何使用ConfigParser。您可以使用config["my_section"].get("my_option", "fallback_value")进行调用(在这里,确实第二个参数“fallback_value”将是默认值),或者使用config.get("my_section", "my_option", fallback="fallback_value")进行调用(在这里,前两个参数是指定要获取哪个部分的哪个选项)。 - Florentin Le Moal
这正是我想要的。谢谢。 - EsmaeelE

11

你可以使用 [DEFAULT] 部分来设置那些你没有在其他部分中定义的属性的默认值。

例如:

[DEFAULT]
checkout_root: /data/workspace

[pingpong]
name: Ping Pong App
checkout_root: /home/pingpong
src: %(checkout_root)s/src

[dingdong]
name: Ding Dong App
src: %(checkout_root)s/dingdong_src

对于钉钉应用来说,src的值将为/data/workspace/dingdong_src


1
这个回答是针对 OP 的第二个问题的答案。 - Niels Bom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接