2 заметки с тегом

Python

ObjDict v.1.0 — Словарь как объект

После длительного общения с JS, в Python, иногда, разобрав очередной JSON в словарь мне очень не хватало обращения к его вложенным элементам используя точечную нотацию (как у объектов, в JS ведь все объекты).

Хотелось вместо громоздкого json[’a’][’b’][’c’] использовать изящное json.a.b.c обращение.

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

Класс objdict — расширяет dict, позволяя обращаться к его свойствам, как к атрибутам object-a, но при этом, сохраняя его полноценным dict-ом.

class objdict(dict):

    def __init__(self, *args, **kwargs ):
        dict.__init__(self, *args, **kwargs )
        for key, value in self.items():
            if isinstance(value, dict):
                self[key] = objdict(value)

    def __getattr__(self, name):
        if name in self:
            return self[name]
        else:
            raise AttributeError("No such attribute: " + name)

    def __setattr__(self, name, value):
        self[name] = value

    def __delattr__(self, name):
        if name in self:
            del self[name]
        else:
            raise AttributeError("No such attribute: " + name)

Пример использования dot-нотации (присваивание тоже доступно):

>>> my_dict = {'a': {'b': {'c': 'OK'}}}
{'a': {'b': {'c': 'OK'}}}

>>> my_dict.a.b.c # пример ошибки
AttributeError: 'dict' object has no attribute 'a'

>>> my_objdict = objdict(my_dict) # преобразуем в objdict

>>> my_objdict # внешне остается таким же словарем, но...
{'a': {'b': {'c': 'OK'}}}

>>> my_objdict.a.b.c # получить свойство на 3-м уровне проще простого
'OK'

>>> my_objdict.a.b = 'END' # задать или удалить значение тоже не составляет труда
>>> my_objdict.a.b
{'a': {'b': 'END'}}

@ToDo: В версии 1.1 планирую добавить .get() обработчик с форматом objdict.get(’a.b.c’, ’default value’) для получения значения без необходимости перехвата AttributeError, будет еще более удобным для работы c JSON.

2018   Python   Использую   Код

PythonTree

Сегодня, я читал статьи про деревья в БД и случайно в картинках наткнулся на изображение красиво отображающее в консоли иерархическое дерево директории:

В этот момент, мной овалдело непреодолимое желание написать свою версию на Python.

Безо всяких попыток удержаться от такого внутреннего вызова, я немедленно вступил в схватку с неизвестностью. Спустя час с небольшим мне явилось чудо рождения первой, желанной, не до конца окрепшей, но действующей версии метода для отображения дерева. Сейчас это весьма черновой вариант, но он уже полностью рабочий, результат выглядит так:

── TestFolder
   ├─── go
   │    └ image-resizer
   │      ├── handlers.go
   │      └── image_server.go
   │
   └─── scripts
        ├── configure_elasticsearch.py
        ├── email_resend.py
        └── image_upload.py

В терминале:

Интересный факт, благодаря использованию os.walk() основная функция получилась НЕ рекурсивной и формирует дерево в один проход.

Первая версия уже умеет:

  1. отображать дерево красивыми Unicode символами — про это читал здесь
  2. добавляет пустое пространство после последнего файла в директории (spacing_after_last_file=True)
  3. подсвечивать цветом имена файлов, диретории и линии ( colors=True ) — читал тут
  4. отображать дерево в компактном виде ( compact=True )

Планы на будущие версии:

  1. оформить в виде полноценного модуля
  2. добавить возможность отображать стандартными символами ( ` — | )

На неделе, найду время и более подробно опишу процесс здесь.

Ссылка на репозиторий: PythonTree на GitHub

2017   Python   Развлекаюсь