2013-09-16 7 views
2

Я пытаюсь написать страницу простого создания персонажа в python. Мне нужен вариант для пересчета. Проблема в том, что после обновления страницы статистика остается неизменной. Ниже мой код:Random.randint() не работает после обновления.

Views.py

from my import Character 
... 
def create_character(): 
    characterform = CharacterForm() 
    if request.method == 'GET': 
    hero = Character() 
    hero.gen_stat() 
    return render_template('create_character.html', hero = hero, form = characterform) 

my.py

class Character(): 
def __init__(self): 
    self.attack = 0 
    self.defense = 0 
    self.hp  = 0 
    self.ini  = 0 


def gen_stat(self,attack = randint(0,10), defense = randint(0,10), hp = randint(10,20), ini = randint(0,5)): 
    self.attack = attack 
    self.defense = defense 
    self.hp  = hp 
    self.ini  = ini 

сейчас я учусь питона, так Propably я делаю что-то неправильно. Странно то, что, если я обновляюсь через несколько минут, статистика меняется, возможно, это связано с кешированием?

Пожалуйста, помогите мне решить эту проблему.

ответ

4

Параметры по умолчанию оцениваются только один раз (когда функция создана).

>>> def g(): 
...  print('g() is called') 
...  return 1 
... 
>>> def f(a=g()): # g() is called when f is created. 
...  pass 
... 
g() is called 
>>> f() # g() is not called! 
>>> f() # g() is not called! 

Заменить gen_stat следующим образом:

def gen_stat(self, attack=None, defense=None, hp=None, ini=None): 
    self.attack = randint(0, 10) if attack is None else attack 
    self.defense = randint(0, 10) if defence is None else defense 
    self.hp  = randint(0, 10) if hp  is None else hp 
    self.ini  = randint(0, 10) if ini  is None else ini 

КСТАТИ По PEP 8 -- Style Guide for Python Code:

Избегайте посторонних пробелов в следующих ситуациях:

...

  • Более одного места вокруг оператора присваивания (или другого) для выравнивания его с другим. не

    Да:

    x = 1 
    y = 2 
    long_variable = 3 
    

    №:

    x    = 1 
    y    = 2 
    long_variable = 3 
    
+0

Повторение привело вас использовать посторонние пробела для выравнивания, рассмотрит вспомогательную функцию 'возврата пары если параметр не является ничем другим randint (0, 10) '. –

+0

Я бы использовал 'randint (0, 10), если атака - это еще не атака и т. Д., Чтобы избавиться от' not', но я бы не использовал для этого вспомогательную функцию. Это не увеличило бы удобочитаемость, и пока четыре линии останутся вместе, риск частичного исправления ошибок (то есть только в одном из них) этого удвоения кода ограничен. – Alfe

+0

Может быть так: 'для поля в '' атаке ',' защите ',' hp ',' ini '):' 'original = locals() [field]' 'setattr (self, field, randint (0, 10), если оригинал не является оригинальным оригиналом) ' – Alfe

Смежные вопросы