我正在尝试编写一个try / except块,它声明了两个通过ConfigParser
检索其值的变量。我遇到的问题是,声明的一个或两个值可能不会出现在特定部分下,在这种情况下应该设置为None
。我知道我可以简单地将值添加到每个配置文件中,但是,并非所有配置在部分名称中都是一致的,这变成了一项非常繁琐的任务。
有没有更好的方法来实现以下try / except块而不将它们分成两个单独的?
try:
ports = getCfgStr(sectName, 'ports')
terminal = getCfgStr(sectName, 'terminals')
except KeyError:
# Need to set ports or terminal to None depending on which raised the KeyError
我的解决方案解决方案:
try:
ports = getCfgStr(sectName, 'ports')
except KeyError:
ports = None
try:
terminals = getCfgStr(sectName, 'terminals')
except KeyError:
terminals = None
答案 0 :(得分:4)
有趣的问题!
这个怎么样:
def lookup(param):
try:
return getCfgStr(sectName, param)
except KeyError:
return None
ports = lookup('ports')
terminal = lookup('terminals')
答案 1 :(得分:3)
最好的解决方案是让你的getCfgStr
函数能够接受默认值,如果部分中没有这样的选项,它将返回。所以你的代码将是这样的:
ports = getCfgStr(sectName, 'ports', None)
terminal = getCfgStr(sectName, 'terminals', None)
如果您必须使用例外,那么您的解决方案就可以了。
答案 2 :(得分:0)
也许只是做一个功能:
def get_or_default(name, default):
try:
result = getCfgStr(sectName, name)
return result
except KeyError:
return default
这样打电话:
ports = get_or_default('ports', None)
然而,如果您使用ConfigParser
,更好的方法是更改getCfgStr
函数以使用库的方式:https://docs.python.org/3.4/library/configparser.html#fallback-values
答案 3 :(得分:0)
您可以明确检查选项是否存在,而不是使用coding by exception的反模式:
RawConfigParser.has_option(section, option)
如果给定的部分存在,并且包含给定的选项,则返回True;否则返回False。