Может ли PyCharm ругаться просто так?

Надо было решить задачу с таким условием:

Напишите программу, которая находит общий доход, затем выводит фрукт с минимальным доходом и удаляет его из словаря. Выведите итоговый словарь на экран. Результат работы программы: Общий доход за год составил 35419.34 рублей Самый маленький доход у grapefruit. Он составляет 300.4 рублей Итоговый словарь: {'apple': 5600.2, 'orange': 3500.45, 'banana': 5000.0, 'bergamot': 3700.56, 'durian': 5987.23, 'peach': 10000.5, 'pear': 1020.0, 'persimmon': 310.0}

Получился такой код:

incomes = {
    'apple': 5600.20,
    'orange': 3500.45,
    'banana': 5000.00,
    'bergamot': 3700.56,
    'durian': 5987.23,
    'grapefruit': 300.40,
    'peach': 10000.50,
    'pear': 1020.00,
    'persimmon': 310.00,
}

print('Общий доход за год составил', sum(incomes.values()), 'рублей')

for key in incomes:
    if incomes[key] == min(incomes.values()):
        worst_product = key

print('Самый маленький доход у {0}. '
      'Он составляет {1} рублей'.format(worst_product, min(incomes.values())))

incomes.pop(worst_product)

print('Итоговый словарь:', incomes)

Но PyCharm почему-то подчеркивает worst_product в строке:

      'Он составляет {1} рублей'.format(worst_product, min(incomes.values())))

Name 'worst_product' can be undefined

При этом, все работает

В чем причина?


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

Автор решения: Pavel Mayorov

Суть ошибки в том, что если словарь incomes окажется пуст - в переменную worst_product не будет присвоено значение. Возможно, это и не ошибка вовсе, но PyCharm-то не знает что должно произойти в этом случае.

Это предупреждение можно подавить через явную инициализацию worst_product перед циклом (что является общим способом для любых языков программирования):

worst_product = None
for key in incomes:
    if incomes[key] == min(incomes.values()):
        worst_product = key

Или же можно воспользоваться else-блоком к циклу (так можно делать только в Питоне):

for key in incomes:
    if incomes[key] == min(incomes.values()):
        worst_product = key
        break
else:
    worst_product = None

В любом случае, случай пустого словаря надо в дальнейшем правильно обработать. Или не нужно, если он невозможен, а задача лишь в подавлении предупреждения.

PS у вас цикл квадратный на пустом месте, не надо так делать. Почитайте про алгоритм поиска минимального элемента.

→ Ссылка