2012-03-21 5 views
5

免責事項:はい、私は私が示唆されてるものを実現するには、私は非常に特別な(AB)ユースケースを持って、クレイジーです。私は辞書リテラルが発注した辞書に評価したいので、私はexec'dコードから元の順序を保存することができ、特定の幹部の中でpython dictリテラルをordered dictsとして評価する方法はありますか?

私は__ __builtin交換してみました。execの前のdict(後にそれを復元することは非常に慎重である)、しかしそれは、唯一のdictコール自体を辞書リテラルには影響を与えません。

>>> import __builtin__ 
>>> __builtin__.dict = list 
>>> exec "a={}" 
>>> a 
{} 
>>> exec "a=dict()" 
>>> a 
[] 

明らかにdisモジュールがありますが、それは軌道アプローチからの核です。

私は辞書リテラルの評価にフックと何が起こるかを変更することができますいくつかの他の方法はありますか?

P.S. python2.6

+0

辞書リテラル構文いるように私は、あなたがソースに 'のdict(ここではタプル)'と辞書リテラルを交換する必要があるだろうと思いますしたがって、それらがdictsとして解釈されないなら、Pythonではありません。 – agf

答えて

1

のために私はあなたが与えられたコードをast.parseし、対応するコンストラクタ呼び出しを持つすべてのast.Dictエントリを置き換える可能性があるとastモジュール、を見てすることをお勧めしたいです。

(しかし、申し訳ありませんが、あなたが本当に奇妙な何かをしたいと思われます。)

+0

私がASTを忘れてしまった、それは同じカテゴリでいるが、間違いなく、おそらくDISよりはましです。 –

+0

まあ、理由ましょう:あなたは(それがPythonやその他もろもろだ場合に関係なく)プログラムの動作を変更する必要があります。ソースレベルで変更するか、コンパイルした後、または実行環境にパッチを当てます。 '{}'は環境によって影響を受けることはありません(インタープリタをパッチしない限り)。したがって、バイトコードをパッチするか、より堅牢でポータブルでデバッグにやさしいソースにパッチを当てます。 – bereal

関連する問題