Форум сайта python.su
Можно ли как-то сделать, например, чтобы {} создавал не dict, а OrderedDict?
Офлайн
Вряд ли. Но если очень сильно извернуться, можно через 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)
Офлайн
Жалко, литерал словаря намного приятнее друхмерного списка.
Офлайн
odnochlenв третьем питоне скобки ещё и для множеств используются
Можно ли как-то сделать, например, чтобы {} создавал не dict, а OrderedDict?
Офлайн