Как вернуть переменные, кратные переменной, из функции Python - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть функция, которая извлекает строку из веб-сайта, функция выглядит следующим образом:

def get_maps_info(url):
page = get_parsed_page(url)
# extract match infos 
maps = page.find('div', {'class' : 'padding preformatted-text'})
return maps.text

Код выше будет возвращать что-то вроде этого:

'Best of 1\n\n* Group B elimination match'

Так что я есть другая функция, которая проверяет, если find 'Best of 3' запускает первое 'if', я очень новичок ie в python, но я думаю, что это нормально, если у вас есть какие-то советы или рекомендации, пожалуйста, покажите мне .

Проблема в том, что мне нужно вернуть все эти переменные, как я могу это сделать?

def get_results_maps(url):
page = get_parsed_page(url)

if 'Best of 3' in get_maps_info(url):
    ## verify team winners for each map for Best of 3
    ## first team is the winner and second is the loser and so on
    if int(page.findAll('div', {'class' : 'results-team-score'})[0].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[1].text):
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)   
    else:
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 

    if int(page.findAll('div', {'class' : 'results-team-score'})[2].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[3].text):
        team_winner_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)
        team_loser_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
    else:
        team_winner_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)

    if int(page.findAll('div', {'class' : 'results-team-score'})[4].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[5].text):
        team_winner_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)
        team_loser_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text) 
    else:
        team_winner_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)

    # end verify team winners for each map for Best of 3

    ## verify team winners for each map for Best of 1
elif 'Best of 1' in get_maps_info(url):
    if int(page.findAll('div', {'class' : 'results-team-score'})[0].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[1].text):
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)   
    else:
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 
    # end verify team winners for each map for Best of 1    

return (team_winner_map1, team_loser_map1, team_winner_map2, team_loser_map2, team_winner_map3, team_loser_map3)

Ошибка после запуска вышеуказанной функции:

error

Я не знаю, достаточно ли я ясен, иначе не стесняйтесь спрашивать обо мне.

1 Ответ

0 голосов
/ 28 февраля 2020

Проблема, с которой вы столкнулись, заключается в том, что не все переменные, которые вы используете в своем выражении return, созданы в приведенном выше коде. Это может произойти несколькими способами.

Для начала, если не появятся ни Best of 1, ни Best of 3, вы не определите любых переменных. Это, очевидно, плохо и может указывать на то, что ваши данные не полностью соответствуют ожидаемому формату. Вы можете диагностировать эту ситуацию, добавив секцию else в существующие ветки if / elif. Даже если это не должно происходить, часто стоит проверить каждую возможность и, по крайней мере, сообщить об ошибке хорошим способом.

Другая проблема заключается в том, что ваши параметры if и elif определяют различные наборы переменные. Ваш текущий код ожидает всех трех пар выигрышных и проигрышных очков, но в случае Best of 1 он найдет только первую пару. Чтобы это исправить, вам нужно либо настроить оператор return для каждой ветви (так что в лучшем случае 1 может возвращать 2-кортеж, а не 6-кортеж), либо вам нужно определить фиктивные значения для игр, которые никогда не будут произошло. (Я также не уверен, что вы всегда получите три результата игры в лучшем из трех, но это другая проблема.)

Незначительная проблема (которая может или не может быть большой проблемой, в зависимости от о том, как реализован код, который вы не показывали) в том, что вы неоднократно вызываете функцию get_maps_info в различных тестах для вашего if / elif. Это может быть неэффективно, если необходимо получить URL-адрес из Интернета. каждый раз. Лучшим подходом может быть сохранение результатов всего одного вызова и повторное использование его по мере необходимости (как вы уже делаете с page).

Собрав все это вместе, я бы структурировал код как-то более как:

page = get_parsed_page(url)
maps_info = get_maps_info(url)

if 'Best of 3' in maps_info:
    ...     # code to find winner/loser stuff omitted for brevity

    return (team_winner_map1, team_loser_map1,
            team_winner_map2, team_loser_map2,
            team_winner_map3, team_loser_map3) # move the current return statement here!

elif 'Best of 1' in maps_info:
    ...

    return (team_winner_map1, team_loser_map1) # return a 2-tuple in this case

else:  # report error if we don't get any of the strings we expect
    raise ValueError("Expected Best of 3 or Best of 1, got map-info: {!r}".format(map_info))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...