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