Переменная может быть не определена - PullRequest
0 голосов
/ 14 мая 2018

У меня есть этот кусок кода:

from django.db import transaction

with transaction.atomic():
    try:
        variable = 1
    except Exception:
        raise Exception()

print(variable)

И Pycharm (2018.1.2) говорит мне, что variable в print функция can be not defined.В каком случае это может произойти?Или это баговая ошибка?

1 Ответ

0 голосов
/ 14 мая 2018

в каком случае это может произойти?

Если менеджер контекста проглатывает исключение и если вы заменяете оператор raise чем-то другим, что не прерывает поток выполнения до того, как он достигнет строки print(variable).

Как правило: код, который не зависит от условия (в самом общем смысле), не должен использовать имена, которые условно определены, и только код, принадлежащий той же ветви, что и код, определяющий имя, должен получить доступ к этому имени

Даже если вы «знаете», что в текущей реализации это имя никогда не будет доступно, если оно не определено (как в вашем примере), любое даже незначительное изменение реализации может нарушить это предварительное условие, и вы не обязательно обратите на это внимание и не получите достаточного покрытия для тестирования, чтобы убедиться, что ваши тесты поймут проблему. Я видел, что это происходит достаточно часто, и иногда ошибка появляется только спустя месяцы после изменения (обычно в коде обработки ошибок для довольно редкого патологического углового случая).

Короче говоря, безоговорочно определяя имя с некоторым значением часового (None или чем-то еще, что имеет смысл), прежде чем условная часть (-и) убедится, что ваш код не будет неожиданно ломаться после того, что предполагалось незначительное изменение кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...