Django模型由于某种原因未保存(第二次运行函数后)

2024-09-27 00:15:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做游戏。为了让用户能够移动,他们需要解决数学问题。上/下/左/右各有问题。在游戏开始时,生成4道数学题。代码如下:

def generate_first_4_problems(level, operation, game_object, player_type):

    creator_problems = ['p1up', 'p1right', 'p1down', 'p1left']
    opponent_problems = ['p2up', 'p2right', 'p2down', 'p2left']

    problems = []
    answers = []
    while len(problems) < 4:
        problem = generate_problem(level, operation)
        answer = x(problem).expr()
        if answer not in answers:
            problems.append(problem)
            answers.append(answer)
    print('problems')
    print(problems)
    if player_type == 'creator':
        for i, d in enumerate(creator_problems):
            setattr(game_object, d, problems[i])
            print('creator_problem %s' % d)
            print(getattr(game_object, d))
        game_object.save()
    elif player_type == 'opponent':
        for i, d in enumerate(opponent_problems):
            setattr(game_object, d, problems[i])
            print('opponent_problem %s' % d)
            print(getattr(game_object, d))
        game_object.save()
    game_object.save()
    print('after save')
    print(game_object.p1up)
    return problems

此代码对每个玩家(创建者和对手)运行两次 此外,打印内容如下:

problems
['7 + 3', '1 + 4', '10 + 9', '8 - 10']    
creator_problem p1up
7 + 3
creator_problem p1right
1 + 4
creator_problem p1down
10 + 9
creator_problem p1left
8 - 10
after save
7 + 3
{'problem_list': ['7 + 3', '1 + 4', '10 + 9', '8 - 10']}
problems
['2 + 6', '2 + 3', '4 - 8', '0 + 3']
opponent_problem p2up
2 + 6
opponent_problem p2right
2 + 3
opponent_problem p2down
4 - 8
opponent_problem p2left
0 + 3
after save
None

调用第一个func的代码:

def generate_first_4_problems_game(level, operation, game_object, player_type):
    problem_list = generate_first_4_problems(
        level, operation, game_object, player_type)
    context['problem_list'] = problem_list

有人能帮忙吗

回溯

Traceback (most recent call last):
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/channels/worker.py", line 119, in run
    consumer(message, **kwargs)
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/channels/sessions.py", line 78, in inner
    return func(*args, **kwargs)
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/channels/auth.py", line 42, in inner
    return func(message, *args, **kwargs)
  File "/home/michael/projects/gameapollius/engine/game_consumers.py", line 439, in ws_receive_game
    signals[signal]()
  File "/home/michael/projects/gameapollius/engine/game_consumers.py", line 421, in send_answer
    if is_correct_answer(getattr(game, d), int(answer)):
  File "/home/michael/projects/gameapollius/engine/game_consumers.py", line 60, in is_correct_answer
    answer = x(problem_string).expr()
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/parsley.py", line 85, in invokeRule
    ret, err = self._grammar.apply(name, *args)
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 462, in apply
    val, err = self._apply(r, ruleName, args)
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 495, in _apply
    [rule(), self.input])
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 198, in rule_expr
    _G_apply_55, lastError = self._apply(self.rule_expr2, "expr2", [])
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 495, in _apply
    [rule(), self.input])
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 218, in rule_expr2
    _G_apply_61, lastError = self._apply(self.rule_value, "value", [])
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 495, in _apply
    [rule(), self.input])
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 62, in rule_value
    _G_or_19, lastError = self._or([_G_or_15, _G_or_17])
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 598, in _or
    ret, err = f()
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 54, in _G_or_15
    _G_apply_16, lastError = self._apply(self.rule_number, "number", [])
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 495, in _apply
    [rule(), self.input])
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 17, in rule_number
    _G_consumedby_5, lastError = self.consumedby(_G_consumedby_1)
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 676, in consumedby
    _, e = expr()
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 14, in _G_consumedby_1
    _G_many1_4, lastError = self.many(_G_many1_2, _G_many1_2())
  File "/pymeta_generated_code/pymeta_grammar__Grammar.py", line 11, in _G_many1_2
    _G_apply_3, lastError = self._apply(self.rule_digit, "digit", [])
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 495, in _apply
    [rule(), self.input])
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 790, in digit
    x, e = self.rule_anything()
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 813, in rule_anything
    h, p = self.input.head()
  File "/home/michael/projects/gameapollius/apvenv/lib/python3.6/site-packages/ometa/runtime.py", line 232, in head
    if self.position >= len(self.data):
TypeError: object of type 'NoneType' has no len()

相关功能(回溯)

def send_answer(answer, game_object, player_type):

    creator_problems = ['p1up', 'p1right', 'p1down', 'p1left']
    opponent_problems = ['p2up', 'p2right', 'p2down', 'p2left']

    if player_type == 'creator':
        for d in creator_problems:
            print('getattr')
            print(getattr(game, d))
            if is_correct_answer(getattr(game, d), int(answer)):
                context['move_direction'] = d
    elif player_type == 'opponent':
        for d in opponent_problems:
            print('getattr')
            print(getattr(game, d))
            if is_correct_answer(getattr(game, d), int(answer)):
                context['move_direction'] = d

Tags: inpyselfgamehomeliblinefile

热门问题