Итак, у меня был аналогичный вопрос, на который был дан ответ в другой теме.
По сути, как изменить значение вложенного словаря с помощью 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 of player - у каждой команды должен быть свой список игроков, которые являются словарями, содержащими статистику этих людей. поэтому у team1 должен быть свой список. team2 другой список и т.д.
self.position1/2 — игроки каждой команды будут занесены в их различные словари позиций. так что словарь статистики игрока Джо Монтаны будет найден в словаре защитников этой команды.
self.roster - должен быть составом этой команды, сгруппированным по позициям. Таким образом, вызов команды print team1.roster должен вывести этих игроков, сгруппированных по позициям.