Немного трюков 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! :)