j2a
ну положим, там где ошибка значений – в тему ValueError/TypeError. AssertionError в этом случае не в кассу.
Соврешенно верно - архитектура приложения вполне может быть такой, что ValueError и AssertionError, что называется, “две большие разницы”
Идея заменить raise ValueError основывалась на предположение, что исключение выбрасывается чтобы заменить неочевидное исключение, которое неизбежно будет выброшенно в ходе дальнейшего выполнения программы (таким куском кода, как re.compile(None), например).
То есть, фактически, эта проверка делается для отладки (для этого assert и нужен), а по ее окончании необходимость проверки должна отпасть, в силу того, что отлаженный код никогда не допустит значения None для паттерна (да-да, выброс исключения - форс-мажор, в большинстве случаев после такой ситуации нужно только залогировать ошибку и прекратить выполнение программы либо в целом, либо упавшей ее части), но к этому мы еще вернемся.
Итак, вместо чуда инженерной мысли
def doQueryString(self,pattern=None):
if (self.CheckPolis(pattern)==False)or(pattern==None):
raise ValueError("I need not null object 'polis' !")
У нас появляется (как правильно заметил
j2a, обязательно с пояснением!)
assert pattern, 'Pattern had to be a non-empty string, got %s instead' %pattern
или, в случае, если пустая строка в качестве шаблона все-таки разрешена
assert isinstance(pattern, basestring), 'Pattern had to be a string, got %s instead' %pattern
или какая-нибудь еще заковыристая проверка, если в ней есть необходимость.
Теперь assert, в случае, если что-то пойдет не так, добросовестно разъяснит, в чем же возникла проблема. Но! здесь всплывает главное отличие assert от raise AssertError - assert сработает, только если переменная __debug__ == True. Т.е. сработает в стандартном режиме запуска интерпретатора, но ни в случае, если питон запущен с оптимизацией!
В этом-то и проявляется сокральная отладочная сущность ассертов. Отсюда и их область применимости - их назначение только перехватить ошибку и вывести ее в более понятом представлении.
В принципе, ситуация схожа с warnings, когда превращая их в обычные исключения, можно сильно ускорить процесс разработки в отладочном режиме.