← Все вопросы

Как заметить, что функция случайно возвращает None, а я забыл написать return?

Задан 11 месяцев назад522 просмотров3 ответа
9

Написал функцию, которая считает сумму, но при вызове получаю None вместо числа:

def total(nums):
    s = 0
    for n in nums:
        s += n
    print(s)

x = total([1, 2, 3]) + 10  # TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Как вообще ловить такие случаи, когда функция отдаёт None, потому что я забыл return?

3 ответа

20
✓ Принятый ответ — помог автору

Это классика: функция без явного return всегда отдаёт None. У тебя стоит print(s), а нужно return s — печать выводит число на экран, но наружу из функции ничего не возвращается, поэтому в x попадает None.

def total(nums):
    s = 0
    for n in nums:
        s += n
    return s   # вот это забыли

Как ловить заранее:

  • Симптом — TypeError: ... 'NoneType' ... при попытке использовать результат. Раз функция должна что-то отдавать, а получаешь None — почти наверняка пропущен return.
  • Не путай print и return: print показывает, return возвращает значение для дальнейшего использования.
  • Линтер (pylint/ruff) и type-checker нередко подсвечивают функцию, которая по одной ветке возвращает значение, а по другой проваливается в неявный None.
Ольга Литвинова Если return нужен только в части веток if — проверь, что во ВСЕХ ветках он есть · 11 месяцев назад
Nikita Hook Самая частая ошибка новичков — поставить print вместо return · 11 месяцев назад
7

У тебя print(s) вместо return s. Без return функция возвращает None — отсюда и NoneType в ошибке.

4

Замени print(s) на return s.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект