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