尝试/除了块声明多个值

时间:2015-05-28 15:52:21

标签: python

我正在尝试编写一个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

4 个答案:

答案 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。