我有这个:
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。用户在会话期间也多次运行此代码。
如何避免重复代码。我基本上想做一个“除外”,否则我看错了吗?
答案 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
(在try
和if
块中),并且可以解决两个错误案例以后:
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'
。