<pre><code class="python">if user_balances.get(author.id, initial_balance) < amount:
await ctx.send('Insufficient funds.')
else:
user_balances[author.id] -= amount</code></pre> <br/> Ты не рассматриваешь ситуацию, когда пользователь не имеет сохранённого баланса (для него нет записи в user_balances), и но при этом amount <= initial_balance. <br/> В этом случае : <br/> 1. get() вернёт initial_balance, так как записи о пользователе нет <br/> 2. условие в if не выполнится, так как initial_balance >= amount <br/> 3. управление перейдёт в else <br/> 4. обращение user_balances[author.id] провалится, так как записи о пользователе нет. <br/> <br/> Рекомендую ознакомиться с методом словаря <a href="https://docs.python.org/3.9/library/stdtypes.html#dict.setdefault" rel="nofollow">setdefault()</a> , который добавляет ключ в словарь, если его там не было. <br/> Но я бы не заморачивался, а использовать вместо простого словаря класс <a href="https://docs.python.org/3.9/library/collections.html#collections.defaultdict" rel="nofollow">collections.defaultdict</a> . Он при попытке прочитать несуществующий ключ добавляет его, вызывая указанную функцию для получения значения. <br/> Например: <br/> <pre><code class="python">from collections import defaultdict
balance = defaultdict(lambda: 100) # по умолчанию значение 100
print(balance) # выведет defaultdict(..., {}) - в словаре пока ничего нет
print(balance["Вася"]) # выведет 100 - ключ "Вася" добавится автоматически
print(balance) # выведет defaultdict(..., {'Вася': 100}) - ключ сохранился в словаре
balance['Петя'] += 50 # создаст ключ "Петя" со значением 100, потом добавит к нему 50
print(balance) # выведет defaultdict(..., {'Вася': 100, 'Петя': 150})</code></pre> <br/> Для своего бота код приспособь сам. Я не знаю, как ты сохраняешь/загружаешь баналс пользователей между запусками бота, но тебе может потребоваться сделать из defaultdict обычный словарь при сохранении, и наоборот - при загрузке. <br/> Вообще я бы не советовал начинать изучения Питона с ботов - это НЕ простая тема.