Python尝试:不要重复代码。尝试:除了和其他
我有这个:Python尝试:不要重复代码。尝试:除了和其他,python,python-2.7,web2py,try-except,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.freshOutT
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可能不存在或可能不存在。在会话期间,用户也会多次运行此代码
如何避免重复代码。我基本上想做一个“除此之外”或者我看得不对吗 如果session.var不存在,可以先使用
hasattr
检查它,避免使用它。这避免了对try
/的需要,除了所有的块
if hasattr(session, 'var') and session.var is not None:
...
else:
...
另一种方法可能是让原始代码中的else
只raise
exception进入except
块,但这有点难看:
try:
if session.var:
...
else:
raise AttributeError
except AttributeError:
...
在这种情况下,我认为“三思而后行”的编程风格(使用hasattr
)比通常更具python风格的“请求原谅比允许更容易”(将异常作为流控制的一部分)要好。但两者都可以
如果您的代码被划分成更小的函数,那么处理这个问题可能会更容易。例如,如果您编写了一个get\u session\u var
函数,它可以从成功案例中返回(在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
假设这是一个web2pysession
对象,请注意它是glion.Storage
的一个实例,它就像一个字典,有两个例外:(1)键可以像属性一样访问,(2)访问不存在的键/属性返回None
,而不是引发异常。因此,您可以简单地执行以下操作:
otherVar = session.var = session.var if session.var else db.utility[1].freshOutTheBank
注意,如果要区分不存在的键和显式值为None
的键,则不能使用hasattr(session,'var')
,因为即使没有'var'
键,也会返回True
。相反,您可以检查session.has_key('var')
,如果没有'var'
键,它将返回False
。或如果getattr(session,'var',None)不是None
,则融合存在性/无检查。如前所述,hasaattr(session,'var')
对于web2pysession,因为对于不存在的键/属性,它只会返回None
,而不会引发异常。我试图避免检查。我确信我最终会得到这个职位,因为有一个AttributeError被抛出,我正试图处理它。但是,我已经将代码更改为一个简单的if-else,即使在未设置变量的情况下,它也可以在登录时工作。谢谢