Как устранить ошибку Key Error Exception при обращении к ключу словаря внутри оператора if
В настоящее время я разрабатываю EV-калькулятор, используя python и django. Я получаю ошибку key error exception при попытке получить доступ к ключу словаря в операторе if внутри функции.
Чтобы понять это, моя функция калькулятора делает следующее, предлагает пользователю ввести четыре значения, wager_amount, odd1, odd2 and odd_to_bet/back_odd, на основе значений, введенных пользователем, функция выводит expected value or ev в jinja html. Следует отметить, что odd_to_bet/back_odd должно быть либо равно odd1 or odd2, если odd_to_bet/back_odd не равно odd1 or odd2, то функция имеет блок else с сообщением, чтобы сказать пользователю Please, check the odds again for any typo error!.
Пример: допустим, пользователь вводит следующие значения из html-формы
wager_amount = 10
odd1 = 1.54
odd2 = 2.47
odd_to_bet/back_odd = 1.54
This works fine, i'm able to display output without issues
исключение ошибки ключа возникает, когда пользователь вводит и отправляет odd_to_bet/back_odd значение, не равное odd1 or odd2.
wager_amount = 10
odd1 = 1.54
odd2 = 2.47
odd_to_bet/back_odd = 1.52
My expected output should be "Please, check the odds again for any typo error!." displayed in the html.
Мой функциональный код
def func_two_way(wager_amount, home_odd, away_odd, back_odd):
if back_odd == home_odd:
total_returns = home_odd * wager_amount
profit = total_returns - wager_amount
home_prob = 1/home_odd
away_prob = 1/away_odd
prob_not_occuring = away_prob
ev = (home_prob * profit)-(prob_not_occuring * wager_amount)
my_dict = {
'odd1': home_odd,
'odd2': away_odd,
'wager_amount': wager_amount,
'ev': round(ev, 2),
'back_odd': back_odd,
}
return my_dict
elif back_odd == away_odd:
total_returns = away_odd * wager_amount
profit = total_returns - wager_amount
home_prob = 1/home_odd
away_prob = 1/away_odd
prob_not_occuring = home_prob
ev = (away_prob * profit)-(prob_not_occuring * wager_amount)
my_dict = {
'odd1': home_odd,
'odd2': away_odd,
'wager_amount': wager_amount,
'ev': round(ev, 2),
'back_odd': back_odd,
}
return my_dict
else:
message = 'Please, check the odds again for any typo error!'
# print(user_res)
my_dict = {
'user_res': message,
}
return my_dict
мое представление в django
def two_way_ev(request):
if request.method == 'POST':
wager_amount = int(request.POST.get('wager_amount'))
odd1 = float(request.POST.get('odd1'))
odd2 = float(request.POST.get('odd2'))
back_odd = float(request.POST.get('back_odd'))
print(wager_amount)
my_func = func_two_way(wager_amount, odd1, odd2, back_odd)
print(my_func)
context = {
'wager_amount': my_func['wager_amount'],
'odd1': my_func['odd1'],
'odd2': my_func['odd2'],
'ev': my_func['ev'],
'back_odd': my_func['back_odd'],
'user_response': my_func['user_res'],
}
return render(request, 'two_way_ev.html', context)
else:
return render(request, 'two_way_ev.html', {})
html шаблон
<div class="container text-justify">
<p>Odd you are backing is {{back_odd}}</p>
<p>Your total wager amount is ${{wager_amount}}</p>
<p>Expected value is ${{ev}}</p>
<p>{{user_response}}</p>
</div>
сообщение об ошибке
KeyError at /blogapp/two_way_ev/
'wager_amount'
Request Method: POST
Request URL: http://127.0.0.1:8000/blogapp/two_way_ev/
Django Version: 4.0.2
Exception Type: KeyError
Exception Value:
'wager_amount'
Exception Location: C:\Users\Admin\Desktop\BERNIEBLOG\myblog\blogapp\views.py, line 88, in two_way_ev
Python Executable: C:\Users\Admin\.virtualenvs\BERNIEBLOG-Vx11UYiR\Scripts\python.exe
Python Version: 3.8.0
что я делаю не так?
После беглого просмотра вашего кода я могу определить, что вы никогдане инициализируете ключ 'user_res' в вашем словаре безвозникновения ошибки, так что в некотором роде ничего не происходит неправильно, и это вызывает ваш крах.
Ваш код django пытается построить словарь context и получает исключение KeyError, потому что ключ 'user_res' просто отсутствует!, простым решением было бы инициализировать этот ключ во всех ваших словарях, например, так:
my_dict = {
'odd1': home_odd,
'odd2': away_odd,
'wager_amount': wager_amount,
'ev': round(ev, 2),
'back_odd': back_odd,
'user_res' : 'everything went fine!'
}
этого будет достаточно для того, чтобы ваше приложение работало!
P.S. Я также должен добавить, что это было бы немного более элегантным решением, если бы вы попросили пользователя просто выбрать ставку, введя число (1 или 2 в зависимости от ставки), а не вводить длинное значение с плавающей точкой и расстраиваться, если он допустит опечатку.