Как устранить ошибку 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 в зависимости от ставки), а не вводить длинное значение с плавающей точкой и расстраиваться, если он допустит опечатку.

Вернуться на верх