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

Код

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   Использую   Код

Hello, world!

Bash

echo "Hello, world!"

Basic

PRINT "Hello, world!"​

CoffeeScript

console.log "Hello, world!"

Go

package main
import "fmt"
func main() {
    fmt.Println("Hello, world!")
}

JavaScript

console.log("Hello, world!");

PHP

<?php echo 'Hello, world!'; ?>

Python

print("Hello, world!")

Ruby

puts "Hello, world!"

SQL

SELECT 'Hello, world!';
2017   Код   Развлекаюсь