I assert
что абсолютно необходимо.
Важно: Что абсолютно необходимо. Некоторые люди переоценивают вещи.
def factorial(num):
assert int(num)
assert num > 0
Не совсем правильно. long - это также легальная возможность.
def factorial(num):
assert type(num) in ( int, long )
assert num > 0
Лучше, но все же не идеально. Многие типы Python (например, рациональные числа или числовые объекты) также могут работать в хорошей факториальной функции. Трудно утверждать, что объект обладает базовыми целочисленными свойствами, не будучи слишком конкретным и исключая из рассмотрения будущие неосмысленные классы.
Я никогда не определяю уникальные исключения для отдельных функций. Я определяю уникальное исключение для значимого модуля или пакета. Обычно, однако, просто класс Error
или что-то подобное. Таким образом, приложение говорит except somelibrary.Error,e:
, это почти все, что вам нужно знать. Мелкозернистые исключения становятся суетливыми и глупыми.
Я никогда не делал этого, но я вижу места, где это может быть необходимо.
assert all( type(i) in (int,long) for i in someList )
Однако, как правило, обычные встроенные проверки типов Python работают нормально. Они находят почти все исключительные ситуации, которые имеют значение почти все время. Когда что-то не подходит, Python вызывает ошибку TypeError, которая всегда указывает на правую строку кода.
КСТАТИ. Я только добавляю утверждения во время разработки, если я абсолютно уверен, что функция будет злоупотреблена. Я иногда добавляю утверждения позже, когда у меня есть модульный тест, который проваливается неясным способом.