Внутренняя функция в python не возвращается в нужном месте - PullRequest
0 голосов
/ 21 февраля 2020

В приведенном ниже коде из моей внутренней функции, независимо от того, набрали ли баллы единственное возвращаемое значение - (0, None). Я вижу, что for l oop заканчивается, когда команда достигает порогов победы или милосердия, но это не действует как возвращаемое значение для всей функции. Я не помню, чтобы операторы return работали подобным образом, поэтому кто-нибудь может объяснить, почему это происходит?

    def victory_check() -> Tuple[Optional[int], Optional[Team]]:
        scores_all_bad: bool = True
        for team in tea_lst:
            print(team.score)  # debug
            if team.score >= victory_threshold:
                return 1, team
            if team.score < mercy_rule:
                return -1, team
            if team.score > bad_ai_end:
                scores_all_bad = False
        if scores_all_bad:
            return -1, None
        return 0, None

Объект Team создается следующим образом. Испытательный жетон добавляет случайное целое число от -12 до 14 к счету каждой команды, притворяясь, что играет руку. Значения Team.score правильно отражены в операторе печати. ​​

class Team:
    players: List[Player]
    score: int = 0
    bid: int

    def __init__(self, players: List[Player]):
        self.players = players

Ответы [ 2 ]

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

Согласно документации ,

оставляет текущий вызов функции со списком выражений (или None) в качестве возвращаемого значения.

Таким образом, единственный способ, с помощью которого функция может выполнять (не возвращать) несколько операторов return, - это когда у вас есть блок try-exc с аргументом в блоке finally. Что-то вроде ниже. Чтобы было ясно, (Python внутренне выполняет два возврата, но фактически возвращается только один)

def nums(list_ofvals):

    score = True
    try:
        for v in list_ofvals:
            if v == 1:
                return "one return", 1

            elif v == 3:
                return "three return", 3
    except:
        pass

    finally:
        if score == True:
            return "true score"
        else:
            pass

print(nums([1])) #function call
0 голосов
/ 21 февраля 2020

Не уверен, как выглядит ваш team_list. Предполагая, что это список словарей, этот код работает должным образом.

team_lst = [{'score': 40}]
def victory_check():
    scores_all_bad: bool = True
    for team in team_lst:
        print(team.keys())
        print(team.get('score'))  # debug
        if team.get('score') >= 5:
            return 1, team
        if team.get('score') < 5:
            return -1, team
        if team.get('score') > 100:
            scores_all_bad = False
    if scores_all_bad:
        return -1, None
    return 0, None
...