Чтобы буквально получить то, что вы просите, вам нужно повозиться с синтаксическим деревом вашего файла. Я не думаю, что это целесообразно делать, но я не мог устоять перед искушением попробовать. Итак, поехали.
Во-первых, мы создаем модуль с функцией 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
?
person
Sven Marnach
schedule
24.10.2011
dict
сохраняют порядок вставки, поэтому в будущем ни один из этих хаков не понадобится. - person Nick Sweeting   schedule 17.12.2016OrderedDict
; Способностьpopitem
всплывать в режиме FIFO недоступна наdict
, аmove_to_end
вообще недоступна (вы можете имитировать режимlast=True
сmydict[key] = mydict.pop(key)
, но это немного дороже, а режимlast=False
недоступен). В версиях 3.6-3.7 также отсутствует возможность перебиратьdict
и его представления в обратном порядке, хотя 3.8 (вероятно) добавляет эту возможность< /а>. - person ShadowRanger   schedule 28.09.2018