Попытка Python: не повторять код.попробуй: кроме как и еще - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть это:

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 голосов
/ 17 ноября 2018

Предполагая, что это объект 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'.

0 голосов
/ 17 ноября 2018

Вы можете избежать использования 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:
    ...

В этой ситуации я думаю, что стиль программирования «Look Before you Leap» (с использованием hasattr) более приятен, чем обычно более Pythonic стиль«Проще просить прощения, чем разрешения» (который использует исключения как часть управления потоком).Но любой из них может работать.

Если бы ваш код был разделен на более мелкие функции, возможно, было бы еще проще справиться с этой проблемой.Например, если вы написали функцию 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
...