Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python尝试:不要重复代码。尝试:除了和其他_Python_Python 2.7_Web2py_Try Except - Fatal编程技术网

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

假设这是一个web2py
session
对象,请注意它是
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')
对于web2py
session,因为对于不存在的键/属性,它只会返回
None
,而不会引发异常。我试图避免检查。我确信我最终会得到这个职位,因为有一个AttributeError被抛出,我正试图处理它。但是,我已经将代码更改为一个简单的if-else,即使在未设置变量的情况下,它也可以在登录时工作。谢谢