Ошибка типа при тестировании / проверке read_input (например, из функции возврата): python3

#python #python-3.x

#python #python-3.x

Вопрос:

Очень рано начал программировать на Python и теперь сталкиваюсь с ошибкой, связанной с тем, что я считаю своими функциями возврата.

где я нахожусь:

Обновил исходное сообщение после получения отличного совета от @Kaushal.

Когда я тестирую ввод для «Введите количество пациентов», я продолжаю получать следующую ошибку:

 TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
  

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

Любые указания на то, как я могу исправить эту ошибку, были бы весьма признательны!

Ответ №1:

Несколько указателей, о которых нужно позаботиться :

  1. Используйте функции для выполнения повторной работы
  2. Используйте обработку исключения специально в случае чтения входных данных
  3. Используйте форматирование строк

Примечание: для чтения входных данных использовалась рекурсия, до тех пор, пока не будет введен допустимый ввод

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

Калькулятор макроэлементов

 def validate_is_positive_numeric(val):
    try:
        val = float(val)
        if val <= 0:
            print("Enter a valid positive value")
            return None, False
    except ValueError:
        print("Enter a valid numeric value")
        return None, False

    return val, True


def read_input(text):
    value, success = validate_is_positive_numeric(input(text))
    if not success:
        value = read_input(text=text)

    return value


def calculate_average(macro_name, total_quantity, total_patients):
    avg = total_quantity/int(total_patients)
    print("Amount of {} (g) required : {}".format(macro_name, avg))


num_patients = read_input("Enter the number of patients: ")


protein, fats, carbs, kilojoules = 0, 0, 0, 0
for _ in range(int(num_patients)):
    protein  = read_input("Amount of protein (g) required: ")
    fats  = read_input("Amount of fats (g) required: ")
    carbs  = read_input("Amount of carbohydrates (g) required: ")
    kilojoules = 4.18*(4*protein   4*carbs   9.30*fats)

calculate_average(macro_name="Protein", total_quantity=protein, total_patients=num_patients)
calculate_average(macro_name="Fats", total_quantity=fats, total_patients=num_patients)
calculate_average(macro_name="Carbohydrates", total_quantity=carbs, total_patients=num_patients)
calculate_average(macro_name="Kilojoules", total_quantity=kilojoules, total_patients=num_patients)

  

Комментарии:

1. Аааа, потрясающе. Спасибо @Kaushal. Эта функция except довольно мощная, я обязательно разберусь в них.

2. Теперь я перенастроил свой код, но при тестировании выполнения я продолжаю получать следующую ошибку: ‘ File «diet.py «, строка 27, в <module> для i в диапазоне (int(number_of_patients)): ошибка типа: объект ‘NoneType’ не вызывается’ ‘ Это когда я тестирую «Введите количество пациентов», и я ввожу «ok», «0», затем «1» в качестве значения для получения ответа. Если я сразу введу ‘1’, все будет работать нормально. Есть идеи, почему это так? :/

3. ооо!! понял, мы не принимаем значение, возвращенное read_input во время рекурсивного вызова, следовательно, оно возвращало значение из первого выполненного вызова, которое должно быть None !! Обновлено