Python диктует, что действует непоследовательно - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть один экземпляр словаря python в качестве глобальной переменной. Я назначаю ему значение только в начале моего кода. Иногда dict.get() возвращает правильный объект, иногда возвращает None. Я не могу найти шаблон для него.

Код является веб-клиентом, который ожидает HTTP-запросов и отправляет ответ. Я инициализирую словарь active_games, чтобы сохранить список игр, ключами которых являются идентификаторы игр с сервера. Игровой объект добавляется в словарь при вызове start() и никогда не удаляется до вызова end(). Между этими двумя move() вызывается много раз (часто несколько раз в секунду). Оператор print в move() иногда печатает правильный словарь, а иногда печатает пустой, который затем выдает ошибку.

Вот соответствующие части кода:

import json
import os
import bottle

from api import ping_response, start_response, move_response, end_response
from game import game

# Store all games running on server
active_games = dict()

@bottle.post('/start')
def start():
    global active_games
    data = bottle.request.json
    new_game = game(data["game"]["id"])

    active_games[str(data["game"]["id"])] = new_game

    print(active_games)

    return new_game.start(data)

@bottle.post('/move')
def move():
    global active_games
    data = bottle.request.json

    print(active_games)

    return active_games.get(str(data["game"]["id"])).move(data)

@bottle.post('/end')
def end():
    data = bottle.request.json

    game_ending = active_games.pop(data["game"]["id"])

    return game_ending.end(data)

Почему не работает dict.get ()? Спасибо за любую помощь! Я могу редактировать, чтобы добавить журналы и трассировку стека, если это поможет

1 Ответ

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

Глядя на фрагменты кода, которые вы разместили, я думаю, что это связано со строкой global active_games в методах start() и end().

" Используется ключевое слово global создавать глобальные переменные из неглобальной области, например, внутри функции."(https://www.w3schools.com/python/ref_keyword_global.asp, последний вызов - 02.11.2020, w3cschools.com -> Python Tutorial -> Python global Keyword -> Definition and Usage)

Но вам не нужно объявлять словарь active_games в этих функциях, потому что вы уже объявили их в самом начале своего скрипта, как это

# Store all games running on server
active_games = dict()

Итак, global active_games делает только то, что переопределяет ваш словарь active_games с пустой переменной с тем же именем, и именно отсюда берется возвращаемое значение None.

Если из описания вашей проблемы сказать, что это не совсем то, что происходит за кулисами, но самое меньшее, что вы можете сделать, - это удалить любые экземпляры global active_games из своего кода и проверить позже со мной

...