Вряд ли. Но если очень сильно
извернуться, можно через
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)]))])
Не советую это использовать