Как правильно создать переменные класса из списка?

Сейчас создаю класс с переменными следующим образом:

from aiogram.dispatcher.filters.state import StatesGroup, State

class States(StatesGroup):
    State1 = State()
    State2 = State()
    State3 = State()

В целевом варианте количество и названия переменных будут меняться и храниться в БД. При запуске приложения я получаю из БД новый список переменных, например:

StateList = ['State1', 'State2', 'State3']

В результате должны быть созданы переменные State1, State2, State3. Какие есть варианты создания без использования eval()?


Ответы (1 шт):

Автор решения: vadim vaduxa

Например используя setattr.

test2.py:

class State:
    pass

test1.py:

import test2

class States:
    pass
ds = set(dir(States))

StateList = ['State1', 'State2', 'State3']
for s in StateList:
    setattr(States, s, test2.State())  # States.State1 = State()

for s in set(dir(States)) - ds:
    print(s, getattr(States, s))

out:

State3 <test2.State object at 0x0000028673C61AF0>
State2 <test2.State object at 0x0000028663538250>
State1 <test2.State object at 0x00000286635E2340>
→ Ссылка