2015-03-22 2 views
2

У меня есть немного стилистический вопрос о проверке параметров.Выполнение предположений о типах и значениях параметров?

(Использование Python)

Скажем, у меня есть метод с параметром a, который должен быть ИНТ, и, возможно, должен быть в определенном диапазоне - то есть индекс списка или что-то. Я мог бы использовать утверждения/другую проверку для обеспечения этого, но что, если я вызываю функцию только из одного или двух мест, а параметр проверяется на правильное значение/тип там? Возможно, возможно, что эту функцию можно было бы вызывать из других мест в будущем, но на данный момент «в принципе» невозможно передать недопустимый параметр.

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

Извините, если это слишком абстрактно - я ожидаю, что ответ может быть просто «это зависит», но мне было любопытно, было ли общее мнение об этом.

+0

Это действительно зависит. В большинстве случаев я бы оставил функцию простой и разрешил возможные проблемы с помощью unittests. Для параметров, поступающих из «непредсказуемого источника» (например, пользователя), я могу использовать «полную» проверку (а также проверить ее с помощью unittests). –

+0

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

+0

У вас есть пример реальной жизни? Если нет, ответ будет "это зависит" –

ответ

0

В целом, мне кажется, не мешает проверять входные параметры для метода каждый раз, когда он вызывается, даже если маловероятно, что параметры неверны. В большинстве случаев вычислительные накладные расходы незначительны (например, тип проверки с if type(x) is not int: raise TypeError занимает около 100 нс на моем ноутбуке, если условие проверено). Кроме того, я не уверен, что выполнение условной проверки стоит того, что касается ремонтопригодности кода (это только усложняет ситуацию).

Конечно, это тоже проблема. Например, если у вас есть вычислительно критичная функция, которая вызывается многократно (скажем, более миллиона раз) в цикле, вероятно, стоит пропустить шаг проверки и заранее проверить параметры.

Смежные вопросы