Как получить доступ к имени словаря Python со строкой?

У меня есть строка "dict_1" и словарь с именем dict_1.

x = "dict_1"
dict_1 = {"a": "b", "c": "d"}

Итак, могу ли я получить доступ к dict_1 как x['a']?

Я нашел вопрос о переполнении стека, но в этом вопросе OP хочет создать переменную со строкой, а не переменную доступа (словарь) со строкой.

Я действительно нуждаюсь в помощи. Я использую Python 3.8 и Windows.

Спасибо!


person Ejelleal    schedule 04.01.2021    source источник


Ответы (1)


Как я это вижу, у вас есть два основных варианта.

Самый очевидный способ — использовать eval для преобразования значения строку x в пригодный для использования объект Python — в данном случае словарь dict_1.

Обратите внимание, что eval выполняет строку как код Python. Если строка исходит из ненадежного источника, то это довольно опасно. Вы должны использовать это с осторожностью и применять соответствующую очистку ко всем входным данным.

x = "dict_1"
dict_1 = {"a": "b", "c": "d"}

print(type(eval(x)))
# Prints <class 'dict'>

print(eval(x)['a'])
# Prints "b"

Другой способ — использовать locals(). Это возвращает словарь переменных, определенных в локальной области видимости. Вы бы проиндексировали его с помощью x, что дало бы вам сам словарь, как с eval.

x = "dict_1"
dict_1 = {"a": "b", "c": "d"}

print(type(locals()[x]))
# Prints <class 'dict'>

print(locals()[x]['a'])
# Prints "b"

Теоретически использование locals() для задания оказалось бы более безопасным, поскольку с eval вы можете непреднамеренно выполнить произвольный код.

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

if x in locals() and type(locals()[x]) == dict:
    print(locals()[x]['a'])
    # Prints "b"
person costaparas    schedule 04.01.2021
comment
Ты обалденный! Благодарю вас! - person Ejelleal; 05.01.2021