Лучший способ назначить множество собственных переменных элементам в списке?

#python-3.x #list #indexing #self

Вопрос:

По сути, я пытаюсь назначить отдельную переменную каждому элементу из списка. Я приложил ниже некоторый код, чтобы лучше объяснить, что я имею в виду:

 class Skill:
    def __init__(self, name):
        skill_detail = SKILLS_LIST[name].values()
        
        self.one = skill_detail[0]
        self.two = skill_detail[1]
        self.three = skill_detail[2]
        self.four = skill_detail[3]
        self.five = skill_detail[4]
        self.six = skill_detail[5]
        self.seven = skill_detail[6]
        self.eight = skill_detail[7]
        self.nine = skill_detail[8]
 

Я думал переключиться на нарезку, но как лучше всего это сделать? Любая помощь будет признательна, спасибо!

Контекст:

Переменные в основном являются атрибутами хода в RPG-игре. Такие вещи, как мощность, точность, приоритет, тип, стоимость энергии и т. Д. Вот почему я чувствую, что все отдельные атрибуты необходимы в качестве самостоятельных переменных, но пока не уверен.

Кроме того, я знаю, что глобальные переменные/константы плохи, но «СПИСОК НАВЫКОВ» — это массивный словарь, извлеченный из файла json, который никогда не будет изменен в коде.

Ответ №1:

Я бы сказал, что то, что вы делаете, не обязательно является плохой практикой, особенно если у вас всего несколько атрибутов.

Но вы упомянули о загрузке данных из файла JSON в словарь, а словари уже являются программным способом создания переменного числа переменных. Так почему бы просто не воспользоваться словарем? и всякий раз, когда вам нужно изменить или прочитать определенный атрибут, вы можете просто сделать skills["power"] skills["cost"] , и т. Д. Это также, вероятно, было бы гораздо более масштабируемым по мере увеличения размера и сложности вашего проекта.

Конечно, если у вас нет контроля над тем, как отформатирован указанный файл JSON, это все усложнит. В таком случае я не вижу ничего плохого в загрузке атрибутов вручную.

Комментарии:

1. О, это правда, у меня могла бы быть только одна самостоятельная переменная, возможно, это весь словарь. Я не знаю, почему я об этом не подумал, это было бы намного проще отслеживать, как вы и сказали. Обязательно переключусь на это, спасибо!

2. Нет проблем @Roopesh-J, рад, что смог помочь. Счастливого кодирования!

Ответ №2:

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

 import json
from typing import NamedTuple


class MyTup(NamedTuple):
    one: str
    two: str
    three: str


c = MyTup(*["hello", "world", "!"])
print(c)
# MyTup(one='hello', two='world', three='!')
print(c.two)
# world
print(json.dumps(c))
# ["hello", "world", "!"]
 

Комментарии:

1. О, ничего себе, никогда раньше не слышал о NamedTuple, кажется, это может быть очень эффективно, попробую. Спасибо!