Словарь Python, содержащий ссылку на глобальную переменную - PullRequest
0 голосов
/ 21 февраля 2019

Мне кажется, что я пытаюсь пойти против Дзэн Питона с этим, но у меня есть такая ситуация:

my_var = False
my_var_2 = True

my_dict = {
    '1': {'a': my_var, 'b': my_var_2}
     .
     .
    'n': {...}
}

Теперь, что я хотел бы сделать, это иметь my_dict ['1 '] значения сохраняют ссылки на глобально объявленные my_var и my_var_2 , чтобы при обновлении my_dict [' 1 '] [' a '] или my_dict [' 1 '] [' b '], my_varи my_var_2 также обновляется.Очевидно, что этого не происходит с текущим кодом, но мне было интересно, можно ли достичь этого эффекта путем некоторого творческого использования языка.

Почему я пытаюсь это сделать?Я хотел бы, чтобы значения my_dict были дескрипторами для my_var и my_var_2, используемых в универсальной функции, работающей над ключом my_dict по ключу, и обновляющей эти переменные, объявленные вне dict (я не могу вызывать переменные по именам из-за уровня универсальностихотя функция).

Есть идеи?

1 Ответ

0 голосов
/ 21 февраля 2019

Одна из возможностей - перегрузить оператор индекса.Для приведенного выше варианта использования достаточно перегрузить установщик значений __setitem__, но, возможно, вам понадобится также __getitem__:

my_var_2 = True
my_var = False

class GlobalMap:
    def __setitem__(self, key, value):
        global my_var, my_var_2
        if key == "a":
            my_var = value
        elif key == "b":
            my_var_2 = value
        else:
            raise Exception('invalid global {}'.format(key))


my_dict = {
    '1': GlobalMap(),
}

my_dict['1']['a'] = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...