Лучшая практика для Python Assert

Если вы хотите, чтобы метод click работал в Chrome, Firefox и т. д., примените следующий стиль к вашему входному файлу. Это будет прекрасно скрыто, это похоже на display: none;

#fileInput {
    visibility: hidden;
    position: absolute;
    top: 0;
    left: -5000px;
}

. Это просто, я протестировал его!

439
задан codeforester 11 June 2018 в 18:46
поделиться

5 ответов

Чтобы иметь возможность автоматически выдавать ошибку, когда x становится меньше нуля на протяжении всей функции. Вы можете использовать дескрипторы классов . Вот пример:

class LessThanZeroException(Exception):
    pass

class variable(object):
    def __init__(self, value=0):
        self.__x = value

    def __set__(self, obj, value):
        if value < 0:
            raise LessThanZeroException('x is less than zero')

        self.__x  = value

    def __get__(self, obj, objType):
        return self.__x

class MyClass(object):
    x = variable()

>>> m = MyClass()
>>> m.x = 10
>>> m.x -= 20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "my.py", line 7, in __set__
    raise LessThanZeroException('x is less than zero')
LessThanZeroException: x is less than zero
139
ответ дан 22 November 2019 в 23:03
поделиться

Единственное, что действительно не так в этом подходе, - это то, что трудно создать очень описательное исключение с помощью операторов assert. Если вы ищете более простой синтаксис, помните, что вы можете также сделать что-то вроде этого:

class XLessThanZeroException(Exception):
    pass

def CheckX(x):
    if x < 0:
        raise XLessThanZeroException()

def foo(x):
    CheckX(x)
    #do stuff here

Другая проблема заключается в том, что использование assert для нормальной проверки условий состоит в том, что затрудняет отключение отладочных утверждений с использованием флага -O.

18
ответ дан 22 November 2019 в 23:03
поделиться

Утверждения следует использовать для проверки условий, при которых никогда не должно происходить . Целью является ранний сбой в случае поврежденного состояния программы.

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


Для Например, если вы пишете функцию для чтения из файла конфигурации в dict , неправильное форматирование в файле должно вызвать ошибку ConfigurationSyntaxError , в то время как вы можете подтвердить ], что вы не собираетесь возвращать Нет .


В вашем примере, если x - это значение, установленное через пользовательский интерфейс или из внешнего источника, лучше всего исключить .

Если x установлен только вашим собственным кодом в той же программе,

713
ответ дан 22 November 2019 в 23:03
поделиться

В дополнение к другим ответам, сами заявляют исключения, но только AssertionErrors. С утилитарной точки зрения утверждения не подходят, когда вам нужен точный контроль над тем, какие исключения вы перехватываете.

21
ответ дан 22 November 2019 в 23:03
поделиться

Операторы assert удаляются при оптимизации компиляции . Итак, да, есть различия как в производительности, так и в функциональности.

Текущий генератор кода не генерирует код для оператора assert, когда во время компиляции запрашивается оптимизация. - Python 2.6.4 Docs

Если вы используете assert для реализации функциональности приложения, а затем оптимизируете развертывание в производственной среде, вы столкнетесь с проблемой «но-это-работает-в-разработке» дефекты.

См. PYTHONOPTIMIZE и -O -OO

348
ответ дан 22 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: