Итак, у меня был похожий вопрос, на который был дан ответ в другой теме.
Как обновить значение словаря, когда пользователь выбирает ключ для обновления, а затем новое значение в Python?
По сути, как получить значение вложенного словаря, измененное с помощью raw_input. Я использовал решение, и оно работало хорошо, но я хотел написать программу с использованием классов. Поэтому я создал класс с методом для редактирования словаря, используя, по сути, тот же код, однако, когда я пытаюсь запустить его в методе класса, он дает мне «ключевую ошибку».
Так что в основной функции это работает, решение в связанном выше вопросе работает отлично. Но в методе класса:
class team: # create a class where each team will be an instance
def __init__(self, name):
self.name = name #name of team will be passed from main
self.list_of_players = [] # create a list of the players
self.position1 = {} # create a dictionary for each of the positions on that team
self.position2 = {}
self.roster = [self.position1, self.position2]
def addplayer(self, player_name): # the name of the player is passed to this method from main
print 'add stats' # fill out the appropriate stats through raw_input
stat1 = raw_input('stat1: ')
stat2 = raw_input('stat2: ')
pos = raw_input('POS: ')
vars()[player_name] = {'stat1' : stat1, 'stat2' : stat2, 'POS' : pos} #create a dictionary
# for the player where all his stats are kept
player = {player_name : vars()[player_name]} # create a dictionary that will show the
# player's name as a string and his stats which are held in the dictionary named after him
self.list_of_players.append(player) # append the new player to the list of players
if pos == 'p1': # add the player and his stats to the appropriate position on the team
self.position1[player_name] = player
elif pos == 'p2':
self.position2[player_name] = player
else:
pass
def editplayer(self, player_name): # player's name is passed to the edit function from main
print self.list_of_players # player's name shows up in the list of players for the team
edit_stat = raw_input('which stat? ') # choose which stat(key) to edit via raw input
new_value = raw_input('new value: ') # choose the new value to apply to the chosen key
vars()[player_name][edit_stat] = new_value # here is where it gives a key error! this worked
#in fact even trying to call and print the players name gives the key error.
#player = vars()[player_name]
#print player
def main(): # the main function
loop1 = 0 # creating a loop so one can come back and edit the teams after creating them
list_of_teams = [] # initializing list of teams
while loop1 < 1:
print list_of_teams # show the user what teams are available to choose from
team_option = raw_input('new team or old: ') # create a new team or work with an old one
if team_option == 'new':
team_name = raw_input('team name? ') # get the team name from raw_input
vars()[team_name] = team(team_name) #create an instance of this team name
list_of_teams.append(team_name) # add the team to the list
else:
team_name = raw_input('which team? ') # choose which existing team to work with
player_choice = raw_input('new player or old? ') # choose to create or edit existing player
player_name = raw_input('player_name? ') # choose which player from raw_input
if player_choice == 'new':
vars()[team_name].addplayer(player_name) # give player_name to addplayer method
print vars()[team_name].list_of_players # shows the new player in the appropriate
# instance's roster. This method seems to be working fine
else:
vars()[team_name].editplayer(player_name) # gives the player's name to the editplayer
# method for the appropriate instance. But the player name just raises a key error in
# edit player method. I am baffled.
print vars()[team_name].list_of_players
if __name__ == '__main__':
main()
Когда это была одна длинная функция, это работало, но выглядело как катастрофа. Пытаюсь изучить лучшие практики ООП, но я не могу понять, как вызвать этот словарь по имени игрока, чтобы изменить значение. Я провел последние несколько дней, рассматривая учебники и вопросы по классам и словарям, но, очевидно, я неправильно понимаю, как переменные передаются от функции к методам.
Тот факт, что он даже не назначает словарь vars () [player_name] для переменной, которая должна быть распечатана, означает, что он не распознает его как словарь, который был создан в методе addplayer. Но тот факт, что он по-прежнему перечисляет этот словарь в списке игроков, означает, что он существует в этом случае. Так почему же он не распознает это, когда я пытаюсь обратиться к нему в методе editplayer? И как мне вызвать встроенный словарь, созданный в одном методе, чтобы изменить значение в этом словаре во втором методе?
Карл указал на хорошие моменты, которые необходимо прояснить: вот то, что я хочу получить.
self.name - я хочу создать экземпляр для каждой команды, созданной
self.list игроков - каждая команда должна иметь свой собственный список игроков, которые являются словарями, ведущими статистику по лицам. поэтому у team1 должен быть свой список. team2 другой список и т. д.
self.position1 / 2 - игроки в каждой команде будут регистрироваться в разных словарях позиций. поэтому словарь статистики игрока Джо Монтаны будет найден в словаре защитников этой команды
self.roster - должен быть список этой команды, сгруппированный по позициям. Таким образом, вызов print team1.roster должен печатать игроков, сгруппированных по позициям