Использование assert в методах - Python - PullRequest
3 голосов
/ 22 апреля 2011

Это плохая практика использования утверждений в методах?

Например,

def add(x, y):
    assert isinstance(x, int) and isinstance(y, int)
    return x + y

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 22 апреля 2011

Совсем нет.

В вашем примере, при условии, что вы задокументировали, что add ожидает целые числа, assert использование этого ограничения в начале метода на самом деле хорошая практика.

Представьте себе другие варианты, которые у вас есть, и насколько они плохи:

  • не проверяйте свои аргументы.Это означает, что метод позже завершится неудачно со странной обратной трассировкой, которая, вероятно, запутает вызывающего и заставит его взглянуть на реализацию add, чтобы получить подсказку о том, что происходит.
  • будет приятно и попытатьсяпреобразовать ввод в int - очень плохая идея, пользователи будут продолжать задаваться вопросом, почему add(2.4,3.1) продолжает возвращать 5.
2 голосов
/ 22 апреля 2011

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

Обновление:

также вы должны обрабатывать все ошибки в любом случае.В противном случае после удаления утверждений могут возникнуть необработанные исключения.(как рекомендовал Макконнелл. См. его цитаты здесь )

0 голосов
/ 22 апреля 2011

Вместо использования утверждений и повышения исключения Assertion ... лучше выполнить правильные проверки с использованием instance () и вызвать надлежащую ошибку TypeError.

0 голосов
/ 22 апреля 2011

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

...