Найти - Пользователи
Полная версия: Переопределить литерал
Начало » Python для новичков » Переопределить литерал
1
odnochlen
Можно ли как-то сделать, например, чтобы {} создавал не dict, а OrderedDict?
reclosedev
Вряд ли. Но если очень сильно извернуться, можно через 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)]))])
Не советую это использовать
odnochlen
Жалко, литерал словаря намного приятнее друхмерного списка.
py.user.next
odnochlen
Можно ли как-то сделать, например, чтобы {} создавал не dict, а OrderedDict?
в третьем питоне скобки ещё и для множеств используются
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB