Как перебрать глобальные переменные в функции?

Есть кусок бота для телеграмма, при старте программы нужно проверить, что переменные, необходимые для запуска на месте, и их булево не False. пока родилось только ужасное решение:

GLOBAL_VAR_1 = None
GLOBAL_VAR_2 = 2
GLOBAL_VAR_3 = 3


def check_vars():
    """Функция проверяет доступность переменных окружения."""
    required_vars = ['GLOBAL_VAR_1', 'GLOBAL_VAR_2', 'GLOBAL_VAR_3']
    for var in required_vars:
        if var not in globals():
            return False
    global GLOBAL_VAR_1, GLOBAL_VAR_2, GLOBAL_VAR_3
    if GLOBAL_VAR_1 is None:
        return False
    if GLOBAL_VAR_2 is None:
        return False
    if GLOBAL_VAR_3 is None:
        return False
    return True


if not check_vars():
    print('Поломалось')

Хочется сделать что-то наподобие этого:

GLOBAL_VAR_1 = None
GLOBAL_VAR_2 = 2
GLOBAL_VAR_3 = 3


def check_vars():
    """Функция проверяет доступность переменных окружения."""
    required_vars = ['GLOBAL_VAR_1', 'GLOBAL_VAR_2', 'GLOBAL_VAR_3']
    for var in required_vars:
        try:
            global var
            if var != None:
                continue
        except:
            return False
    return True

Но не понимаю, как передать в "глобализацию" строку как переменную, а не "глобализировать" ключ цикла


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

Автор решения: Дмитрий Игоревич

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

GLOBAL_AAA = "asdf"
GLOBAL_BBB = "asdfasdf"

user_globals = [item for item in globals().items() if item[0].startswith("GLOBAL_")]
print(user_globals)  # [('GLOBAL_AAA', 'asdf'), ('GLOBAL_BBB', 'asdfasdf')]

Ну а делее делать любые проверки с ними. Кол-во переменных соответственно динамическое.

→ Ссылка