Шаг 8.
Python: тонкости программирования. Шаблоны для чистого Python. ... . Предостережение № 2: инструкции assert, которые никогда не дают сбоя

    На этом шаге мы рассмотрим, в чем заключается это предостережение.

    Удивительно легко случайно написать инструкцию assert, которая всегда при вычислении возвращает истину. Вкратце проблема в следующем.

    Когда в инструкцию assert в качестве первого аргумента передается кортеж, assert всегда возвращает True и по этой причине выполняется успешно.

    Например, это утверждение никогда не будет давать сбой:

assert(1 == 2, 'Это утверждение должно вызвать сбой')

    Эта ситуация связана с тем, что в Python непустые кортежи всегда являются истинными. Если вы передаете кортеж в инструкцию assert, то это приводит к тому, что условие assert всегда будет истинным, что, в свою очередь, приводит к тому, что вышеупомянутая инструкция assert станет бесполезной, потому что она никогда не сможет дать сбой и вызвать исключение.

    По причине такого, в общем-то, не интуитивного поведения относительно легко случайно написать плохие многострочные инструкции assert. Вот пример группы преднамеренно нарушенных тестовых случаев, которые внушали ложное чувство безопасности. Представьте, что в одном из ваших модульных тестов имеется приведенное ниже утверждение:

assert (
    counter == 10,
    'Это должно было сосчитать все элементы'
)

    На первый взгляд этот тестовый случай выглядит абсолютно приемлемым. Однако он никогда не выловит неправильный результат: это утверждение assert всегда будет давать истину, независимо от состояния переменной counter. И в чем же тут дело? А в том, что оно подтверждает истинность объекта-кортежа.

    Более свежие версии Python 3 для таких сомнительных инструкций assert показывают синтаксическое предупреждение.

    Между прочим, именно поэтому вам также всегда следует выполнять быстрый тест "на дым" при помощи своих модульных тестовых случаев. Прежде чем переходить к написанию следующего, убедитесь, что они действительно не срабатывают.

    На следующем шаге мы подитожим приведенный на предыдущих шагах материал.




Предыдущий шаг Содержание Следующий шаг