Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2012 14:06:09

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Переопределить литерал

Можно ли как-то сделать, например, чтобы {} создавал не dict, а OrderedDict?

Офлайн

#2 Июль 14, 2012 17:21:13

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Переопределить литерал

Вряд ли. Но если очень сильно извернуться, можно через ast такое сделать:

import ast
 
 
def convert_dicts_to_ordered(code):
    root = ast.parse(code)
    import_odict = ast.parse("from collections import OrderedDict")
    root.body.insert(0, import_odict.body[0])
    root = ChangeDictToOrdered().visit(root)
    root = ast.fix_missing_locations(root)
    code = compile(root, '<string>', 'exec')
    eval(code, globals())
 
 
class ChangeDictToOrdered(ast.NodeTransformer):
    def visit_Dict(self, node):
        self.generic_visit(node)
        tuples = [ast.Tuple(elts=[key, value], ctx=ast.Load())
                  for key, value in zip(node.keys, node.values)]
 
        od_node = ast.Call(func=ast.Name(id='OrderedDict', ctx=ast.Load()), 
                           args=[ast.Tuple(elts=tuples, ctx=ast.Load())], 
                           ctx=ast.Load(), 
                           keywords=[], starargs=None, kwargs=None)
        return od_node
 
 
code = """
d1 = {1: 2, 3: 4, 5: 6}
d2 = {'test': 2**42, 'foo': 'bar', 'baz': d1}
print 'how about print?', d1
print d2
"""
convert_dicts_to_ordered(code)
print d1
print d2

вывод:
how about print? OrderedDict([(1, 2), (3, 4), (5, 6)])
OrderedDict([('test', 4398046511104L), ('foo', 'bar'), ('baz', OrderedDict([(1, 2), (3, 4), (5, 6)]))])
OrderedDict([(1, 2), (3, 4), (5, 6)])
OrderedDict([('test', 4398046511104L), ('foo', 'bar'), ('baz', OrderedDict([(1, 2), (3, 4), (5, 6)]))])
Не советую это использовать

Отредактировано reclosedev (Июль 14, 2012 17:41:13)

Офлайн

#3 Июль 14, 2012 22:57:50

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Переопределить литерал

Жалко, литерал словаря намного приятнее друхмерного списка.

Офлайн

#4 Июль 15, 2012 04:31:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9749
Репутация: +  843  -
Профиль   Отправить e-mail  

Переопределить литерал

odnochlen
Можно ли как-то сделать, например, чтобы {} создавал не dict, а OrderedDict?
в третьем питоне скобки ещё и для множеств используются



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version