Чтобы буквально получить то, что вы просите, вы должны поиграть с синтаксическим деревом вашего файла.Я не думаю, что это целесообразно, но я не мог удержаться от соблазна попробовать.Итак, начнем.
Сначала мы создадим модуль с функцией my_execfile()
, которая работает как встроенная execfile()
, за исключением того, что все вхождения отображаемых словаря, например, {3: 4, "a": 2}
, заменяются явнымивызывает конструктор dict()
, например dict([(3, 4), ('a', 2)])
.(Конечно, мы могли бы напрямую заменить их вызовами collections.OrderedDict()
, но мы не хотим быть слишком навязчивыми.) Вот код:
import ast
class DictDisplayTransformer(ast.NodeTransformer):
def visit_Dict(self, node):
self.generic_visit(node)
list_node = ast.List(
[ast.copy_location(ast.Tuple(list(x), ast.Load()), x[0])
for x in zip(node.keys, node.values)],
ast.Load())
name_node = ast.Name("dict", ast.Load())
new_node = ast.Call(ast.copy_location(name_node, node),
[ast.copy_location(list_node, node)],
[], None, None)
return ast.copy_location(new_node, node)
def my_execfile(filename, globals=None, locals=None):
if globals is None:
globals = {}
if locals is None:
locals = globals
node = ast.parse(open(filename).read())
transformed = DictDisplayTransformer().visit(node)
exec compile(transformed, filename, "exec") in globals, locals
С этой модификацией мы может изменить поведение отображения словаря, переписав dict
.Вот пример:
# test.py
from collections import OrderedDict
print {3: 4, "a": 2}
dict = OrderedDict
print {3: 4, "a": 2}
Теперь мы можем запустить этот файл, используя my_execfile("test.py")
, получив вывод
{'a': 2, 3: 4}
OrderedDict([(3, 4), ('a', 2)])
Обратите внимание, что для простоты приведенный выше код не касается словаряпонимания, которые должны быть преобразованы в выражения генератора, передаваемые в конструктор dict()
.Вам нужно добавить метод visit_DictComp()
в класс DictDisplayTransformer
.Учитывая приведенный выше пример кода, это должно быть просто.
Опять же, я не рекомендую этот вид возиться с семантикой языка.Вы смотрели в модуль ConfigParser
?