LINUX.ORG.RU

Гуру Python покритикуйте код


0

1
class JsonDB(dict):
    def __init__(self, json_file=None, **kwargs):
        if json_file: # чтение из файла
            from json import load
            with open(json_file, "r") as f:
                dict_json = load(f)
        else: dict_json = {} # создаем пустой словарь

        # обновим словарем переданным в коснтрукторе
        dict_json.update(kwargs)

        for key,val in dict_json.iteritems():
            # каждый словарь в списке преобразуем в объект этого же класса
            # TODO: добавить реализацию для других типов данных
            # list[...] = {dict}
            if isinstance(val, list):
                dict_json[key] = [JsonDB(**sub_val) for sub_val in val]

        dict.__init__(self, dict_json) # инициализация словаря родителя

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError, k:
            raise AttributeError, k

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

    def __delattr__(self, key):
        try:
            del self[key]
        except KeyError, k:
            raise AttributeError, k

Возможности:

  • загрузка файла JSON и преобразование его в наследуемый от словаря объект.
  • доступ к аттрибутам через точку(.) или по ключу (['key'])

Своего рода база данных для сайта, которая передается шаблону.

Спасибо!


Можно все гораздо проще сделать:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self.__dict__ = self
AttrDict(json.loads(jsonvar))
provaton ★★★★★ ()

Я не гуру Питона, и вообще не программист, но могу покритиковать за слишком рваный левый край кода. Стремитесь писать одним блоком, там легче читать и выглядит не как каша.

Deleted ()
Ответ на: комментарий от Deleted

рваный левый край кода
рваный

Не мог бы ты пояснить что это значит? Никакой «рванности» в коде я не заметил.

Было бы здорово, если бы ты переписал тот код так, чтобы он не был рваным.

anonymous ()
Ответ на: комментарий от note173

То есть ему не нравятся отступы? -_-

anonymous ()
Ответ на: комментарий от provaton

Спасибо, не перестаю удивляться возможностям Python. Но в приведенном коде нет реализации доступа через точку (.) для словарей которые находятся в списке.

Поясню с помощью JSON:

{
    "topmenu":
    [
        { "href": 1, "caption": 2 },
        { "href": 3, "caption": 4 }
    ]
}

так вот я бы хотел получить такое:

print topmenu[0].href
print topmenu[0].caption
malya ()
Ответ на: комментарий от malya

Надеюсь правильно или еще можно упростить:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self.__dict__ = self
        for key,val in self.__dict__.iteritems():
            if isinstance(val, list):
                self.__dict__[key] = [AttrDict(**sub_val) for sub_val in val]

malya ()
Ответ на: комментарий от malya

Я не гуру но не смогу удержаться и не покритиковать сам язык. Зачем этот дуратский self указывать в каждом методе в аргументах - какие идиоты не могут запомнить одно ключевое слово. Почему нельзя написать z = (x += 1), что за глупое ограничение. Они думают что делают язык проще а на самом деле всё усложняют делая язык не последовательным и не логиным.

psp13 ()
Ответ на: комментарий от psp13

Зачем этот дуратский self указывать в каждом методе в аргументах

явное, лучше неявного

что такое метод? это функция, которая одним из параметров получает объект. а у других откуда не возмись появляется this в области видимости

mantar ()

«# создаем пустой словарь» - бесполезный комментарий.

deterok ★★★★★ ()
Ответ на: комментарий от mantar

явное, лучше неявного

что такое метод? это функция, которая одним из параметров получает объект. а у других откуда не возмись появляется this в области видимости

Так трудно понять что такое this? Язык что рассчитан на изучение в детском саду? Язык должен быть оптимизирован для профессионального использования а не для того что бы облегчить жизнь последнего двоечника.

А давайте ещё явно будем писать при вызове ф-ции что это ф-ция. Ведь f(x) не явно зато function f with argument x очень явно.

Кстати в this тоже ничего хорошего нет. Гораздо приятнее в ruby @var - сразу видно что это instance variable, не надо писать ни this ни self тем более в параметрах каждой долбаной ф-ции.

Ещё и интерполяции строк нет, а она очень удобна.

psp13 ()
Ответ на: комментарий от malya

Да, вроде все ок. Главное, что код словаря отделен от кода, читающего JSON. Пихать все в один класс - плохо. AttrDict может и в других случаях пригодиться (например, для хранения результата парсинга конфигурационных файлов).

provaton ★★★★★ ()
Ответ на: комментарий от provaton

Нет там никакого ОК

споткнулся уже на этапе: dict создает всегда. Зачем там тогда else? Подсказка:

#incorrect
if var1:
  var2 = str(var3)
else:
  var2 = str()
#correct
var2 = str()
if var1:
  var2 += str(var3)

GateKeeper ★★ ()
Ответ на: комментарий от psp13

Проще вообще как в перле: один разик объяви в самом начале 500-килобайтного файла переменную и не парься. Программирование не для идиотов же. my - для сюда, our - для везде...

GateKeeper ★★ ()
Ответ на: комментарий от psp13

Ещё и интерполяции строк нет, а она очень удобна.

Интерполяция есть. Возможно, это не та интерполяция, что мила твоему сердцу, но она есть.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Помогите еще как перекодировать JSON если в нем есть киррилица, сам фалй

malya ()
Ответ на: комментарий от tailgunner

Помогите еще как перекодировать JSON если в нем есть киррилица, сам файл JSON имеет кодировку UTF-8. При загрузке JSON методом load ошибок нет, но когда пытаюсь доступиться к параметру у которого значение киррилица вылетает ошибка:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
malya ()
Ответ на: комментарий от malya

Обычно с этим справляется шаманство вида s.decode(«utf-8»).encode(«utf8»), но в случае JSON я просто не знаю.

tailgunner ★★★★★ ()
Ответ на: комментарий от malya

Помогите еще как перекодировать JSON если в нем есть киррилица, сам файл JSON имеет кодировку UTF-8. При загрузке JSON методом load ошибок нет, но когда пытаюсь доступиться к параметру у которого значение киррилица вылетает ошибка:

Если попробовать .decode('utf-8') перед скармливанием его в load?

anonymous ()
Ответ на: комментарий от malya

Видел на хабре реализацию этой идеи. ИМХО, дядь, не надо делать из питона яваскрипт. Что будет если имя члена словаря перекроется с названием метода?

jessey ()
Ответ на: комментарий от psp13

не смогу удержаться и не покритиковать сам язык
дуратский

Русский язык тоже критикуешь?

jessey ()
Ответ на: комментарий от jessey

Видел на хабре реализацию этой идеи. ИМХО, дядь, не надо делать из питона яваскрипт. Что будет если имя члена словаря перекроется с названием метода?

Что предложите?

malya ()
Ответ на: комментарий от malya

Предложу использовать язык так, как он это предполагает, а не делать из питона что-то ещё. Иначе выбери другой язык, который будет для тебя удобен.

jessey ()
Ответ на: комментарий от malya

Что предложите?

Не пытаться велосипедить js-like объекты. Просто используй словарь/список, который возвращается json.load.

baverman ★★★ ()
Ответ на: комментарий от jessey

Шумят же. Ладно там редко используемые «magic»-методы, их можно подальше закопать, но вездесущий __init__, честно говоря, смотрится не очень.

baverman ★★★ ()
Ответ на: комментарий от provaton

Виноват, проглядел. Порой в этом чатике не хватает threaded view.

GateKeeper ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.