Вы абсолютно правы , что чаще всего хорошей идеей является выделение общего кода, поскольку это может привести к гораздо меньшему беспорядку в вашем коде, делая его намного более понятным и обслуживаемым.
Например, к чему вы, вероятно, хотите стремиться, это ситуация, когда ваши операторы ввода не более сложны, чем что-то вроде:
no_of_months = get_int("Enter no of months you want for payment: ")
interest = get_int("Enter interest you want for the loan: ")
principal_amount = get_int("Enter principal amount you want as loan: ")
Затем вы размещаете все сложные логи c (печать приглашения, получение значения, проверка на наличие ошибок и повторная попытка при необходимости) внутри этой функции get_int()
, чтобы она вообще не загрязняла ваш основной код. В качестве примера, вот минималистская функция, которая делает то, что вы хотите:
def get_int(prompt):
while True:
try:
input_val = input(prompt)
return int(input_val)
except ValueError:
print(f"The value '{input_val}' is not a valid integer.\n")
Преимущество локализация кода можно увидеть, когда вы хотите добавить дополнительные возможности. Это часто можно сделать плавно, используя параметры по умолчанию, но все же предоставьте больше функциональности, если вы решите его использовать.
Рассмотрим, например, случай, когда вы хотите убедиться, что введенные значения находятся в указанном диапазоне, например, если вы решите, что кредиты должны быть от одного месяца до трех лет включительно, или процентная ставка должна быть больше 3%. Для этого просто измените на get_int()
:
def get_int(prompt, min_val = None, max_val = None):
while True:
# Get input, handle case where non-integer supplied.
try:
input_val = input(prompt)
value = int(input_val)
except ValueError:
print(f"The value '{input_val}' is not a valid integer.\n")
continue
# If min or max supplied, use that for extra checks.
if min_val is not None and min_val > value:
print(f"The value {value} is too low (< {min_val}).\n")
continue
if max_val is not None and max_val < value:
print(f"The value {value} is too high (> {max_val}).\n")
continue
# All checks passed, return the value.
return value
no_of_months = get_int("Enter no of months you want for payment: ", 1, 36)
interest = get_int("Enter interest you want for the loan: ", 3)
principal_amount = get_int("Enter principal amount you want as loan: ")
Из последней строки вы можете видеть, что старые параметры по-прежнему работают нормально, но из предыдущих двух строк вы знаете, что можете укажите диапазон допустимых значений.