Python - Динамическое добавление данных объекта - PullRequest
0 голосов
/ 11 июля 2020

привет, я использую данные из API, который выходит в этом формате (пример охватывает большое количество строк, в данном примере показано только 2)

['347759', '98', '50752599'] 
['426291', '84', '3092962']

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

Mining : rank=347759 , level = 98 , xp = 50752599

Smithing : rank=426291, level = 84, xp = 3092962

я использую HTTP-запросы для получения этих данных, и он занимает много строк, в настоящее время я использую этот код (см. Ниже) для разделения данных на отдельные целые числа в каждой строке

line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        player.mining.rank = skill_data[0]
        player.mining.level = skill_data[1]
        player.mining.xp = skill_data[2]
        line_count = line_count + 1

очевидно, проблема в том, что когда он переходит на следующую строку в файле (второе трио целых чисел) вместо player.mining.rank = skill_data[0] et c, мне вместо этого потребуется player.smithing.rank = skill_data[0] и так далее для 24 разных строк (так как есть 24 различные навыки в игре).

как мне динамически переключаться с добавления одного объекта класса, такого как «добыча полезных ископаемых» (Производный от ' Skills 'и объявлен в объекте' Player ') в другой объект класса, например' smithing '

любые предложения приветствуются - прокомментируйте, если вам нужно больше объяснений или контекста - я быстро отвечу

Я знаю, что могу использовать это (см. Ниже), но проблема в том, что у меня есть несколько игроков, вызывающих из нескольких HTTP-запросов, поэтому он будет охватывать сотни и сотни строк кода, очень похожих с одним объектом разные имена

if line_count == 1: player.mining.rank = skill_data[0] и if line_count == 2: player.smithing.rank = skill_data[0]

объявления классов

для каждого игрока объектом является имя его персонажа, например Conial = Player(...)

1 Ответ

1 голос
/ 11 июля 2020

Вы можете динамически получить атрибут объекта на основе строки

Тем не менее, давайте представим, что у вас есть список навыков игрока в виде строк:

skills = ['mining', 'crafting', 'fishing', ... ]

Вы можете немного изменить свой код:

line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        playerSkill = getattr(player, skills[line_count])
        playerSkill.rank = skill_data[0]
        playerSkill.level = skill_data[1]
        playerSkill.xp = skill_data[2]
        
        line_count = line_count + 1
...