Python尝试:不重复代码。尝试:除其他以外

时间:2018-11-17 00:00:36

标签: python python-2.7 web2py try-except

我有这个:

try:    
    if session.var:
        otherVar = session.var
    else:
        util = db.utility[1]
        otherVar = session.var = util.freshOutTheBank
except AttributeError:
    util = db.utility[1]
    otherVar = session.var = util.freshOutTheBank

...do stuff with otherVar

情况是session.var可能不存在或可能为None。用户在会话期间也多次运行此代码。

如何避免重复代码。我基本上想做一个“除外”,否则我看错了吗?

2 个答案:

答案 0 :(得分:1)

如果session.var不存在,可以先使用hasattr进行检查,以免它不存在。这样可以避免同时使用try / except块。

if hasattr(session, 'var') and session.var is not None:
    ...
else:
    ...

一种替代方法可能是使原始代码中的else只是raise的例外而进入except块,但这有点丑陋:

try:
    if session.var:
        ...
    else:
        raise AttributeError
except AttributeError:
    ...

在这种情况下,我认为“突如其来”的编程风格(使用hasattr)比通常使用Python风格的“比许可更容易获得宽恕”(使用异常作为一部分)更好。流量控制)。但是任何一个都可以工作。

如果将代码分成较小的函数,则可能更容易处理该问题。例如,如果您编写了一个get_session_var函数,则可以从成功的案例中return(在tryif块中),并且可以解决两个错误案例以后:

def get_session_var(session):
    try:
        if session.var:
            return session.var
    except AttributeError:
        pass

    util = db.utility[1]
    session.var = util.freshOutTheBank
    return session.var

答案 1 :(得分:1)

假设这是一个web2py session对象,请注意,它是gluon.Storage的实例,它类似于一个字典,但有两个例外:(1)可以像属性一样访问键,和(2 )访问不存在的键/属性将返回None而不是引发异常。因此,您可以简单地执行以下操作:

otherVar = session.var = session.var if session.var else db.utility[1].freshOutTheBank

请注意,如果要区分不存在的键和具有显式值None的键,则不能使用hasattr(session, 'var'),因为即使存在,也会返回True不是'var'键。相反,您可以检查session.has_key('var'),如果没有False键,它将返回'var'