Я использую assert
s, только если они обеспечивают намного лучшую диагностику, чем сообщения об ошибках, которые я получил бы в противном случае. Ваш третий утверждение
assert(callable(func))
может быть примером для такого утверждения - если func
не вызывается, вы получите сообщение об ошибке в совершенно другой строке кода, чем та, где находится фактическая ошибка, и это может быть не очевидно, как не вызываемый объект оказался в self.symbols_map
. Я пишу «возможно», потому что это зависит от остальной части вашего кода - если это единственное место, где обновляется self.symbols_map
, утверждение также может быть ненужным.
Первый и последний утверждения определенно противоречат идее типизации утки, , а второй является избыточным. Если symbol
не является строкой длины 1, есть вероятность, что self.symbols_map[symbol]
все равно поднимет KeyError
, поэтому нет необходимости в утверждениях.
Последнее утверждение также неверно - type(keypress)
не может быть None
, и проверки типов должны выполняться с isinstance()
. Могут быть очень специализированные приложения, в которых вы не можете разрешить подтипы, но проверка должна выполняться с type(x) is int
вместо type(x) == int
. Проверка на None
должна выполняться x is None
, а не type(x) is NoneType
.
Вам, вероятно, следует написать хороший набор модульных тестов - они будут гораздо более полезными, чем утверждения, и могут сделать почти все ваши утверждения избыточными.