Немного трюков python - испорты, фокусы со словарями

Теги:

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

Как конвертировать переменные python в ключи словаря

Задача выглядит так: значения ключей словаря из названий переменных, а значения - из их объектов.

bird = 1
fish = 'f'
rock = 3
dict_of_animals = {}

# some code

print(dict_of_animals)
>>>
{'bird': 1, 'fish': 'f'}

Проблема эта была поднята на stack overflow. Мне понравилось такое решение:

fruitdict.update({k : v for k, v in locals().copy().iteritems() if k[:2] != '__' and k != 'dict_of_animals'})

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

Как конвертить строки в названия переменных [[daily-note-2021-05-15]]

Как конвертировать ключи словаря в переменные python

Скорее всего вам придется решить и обратную задачу - импортировать словарь в другое пространство имен и перегнать ключи словаря в названия переменных, а значения - в объекты, на которые ссылаются переменные. Проблема разбрирается здесь. Решение просто как веник:

dict_of_animals = {'bird': 1, 'fish': 'f'}
locals().update(dict_of_animals)
print(bird)
1

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

Как импортировать модуль, название которого определяется при импорте

Нетривиальная задача, которая может быть решена по разному. Мы воспользуемся готовым решением - importlib. Сильно синтетический пример:

import importlib

# some code

if this:
    module = importlib.import_module('module.' + this + '.that')
else:
    import module.default as module

Кстати, если Вас интересует скорость конкатенации строк и вообще какие бывают способы, то вот тут можно прочитать об этом.

Как определить тип os в python

И напоследок, если вы гоняете все это между машинами с разнымси осями или используете зависимые от операционной системы сборки, то все очень просто, к примеру вот так можно запускать selenium под windows не прописывая пути к гекодрайверу, а кину его в удобную нам папку.

import os
from selenium import webdriver

if os.name == 'nt':
    driver = webdriver.Firefox(executable_path=r'C:\nowhere\gekodriver\geckodriver.exe')
else:
    driver = webdriver.Firefox()

Собственно, that all folks! :)