首页 > 解决方案 > Python try: ing 不要重复代码。尝试:除了和其他

问题描述

我有这个:

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。用户在会话期间也会多次运行此代码。

如何避免重复代码。我基本上想做一个“除了和其他”,还是我看错了?

标签: pythonpython-2.7web2pytry-except

解决方案


session.var如果它不存在,您可以通过首先检查它来避免使用,使用hasattr. 这避免了对try/except块的需要。

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

另一种方法可能是让else原始代码中的raiseexcept

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

在这种情况下,我认为“跳前检查”风格的编程(使用hasattr)比通常更 Pythonic 风格的“更容易请求宽恕而不是许可”(它使用异常作为流程控制的一部分)更好。但任何一个都可以工作。

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

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

推荐阅读