文字通りあなたが求めているものを手に入れるために、あなたはあなたのファイルの構文木をいじる必要があります。そうすることはお勧めできないと思いますが、試してみたいという誘惑に抵抗することはできませんでした。だからここに行きます。
最初に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
モジュールを調べましたか?