Проверка аргументов Python

Нужно ли проверять аргументы функции?

def divide(a: int, b: int) -> float:
try:
    return a / b
except ZeroDivisionError:
    return 0.0

Или

def divide(a: int, b: int) -> float:
    return a / b

Ответы (3 шт):

Автор решения: passant

Универсального ответа на этот вопрос нет. Но общее правило гласит - "если пользователь имеет возможность ввести некорректные данные - он их рано или поздно обязательно введет". Поэтому в серьезных программах проверка как входных данных так и всевозможных исключительных ситуаций может занимать процентов 80 а то и больше всего объема написанного кода. А в учебных скриптах - ну можно и не проверять.

→ Ссылка
Автор решения: CrazyElf
except ZeroDivisionError:
    return 0.0

Молча "проглатывать" исключения - самый плохой вариант. Если уж ловите исключение, то нужно хотя бы этот факт как-то логировать:

except ZeroDivisionError:
    logging.warning('Случилось деление на ноль!')
    return 0.0

Ну и в целом такой шаблон поведения хорош только его "ленивостью". Если вы точно хотите именно такого поведения функции, то лучше явно проверить случай b == 0 прямо через if, чтобы тот, кто читал код, лучше понимал, что в нём происходит. Хотя в целом это всё-равно вопрос вкуса, конечно. Я бы, наверное, где-то выше по стеку такое исключение ловил. Всё-таки деление - это деление и оно должно быть предсказуемым. На ноль делить нельзя.

Например, вы можете вычислять среднее значение и выводить его куда-то, тогда лучше будет выглядеть наверное так:

from typing import List, Union

def divide(a: int, b: int) -> float:
    return a / b

def get_mean(arr: List) ->  Union[float, str]:
    return divide(sum(arr), len(arr)) if arr else 'недоступно'

print(get_mean([1, 2, 3]))
print(get_mean([]))

Вывод:

2.0
недоступно
→ Ссылка
Автор решения: Пушистик

Вообще правильно делать вот так:

def divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return False

А потом a и b уже напрямую задавать через float(), например:

a = float(input('a = '))
b = float(input('b = '))
res = divide(a, b)

Или просто вот так:

divide(6.0, 365.0)
→ Ссылка