[pukiwiki]
オタクのジョークは よくわからないよシリーズ第一弾 (第2弾は有りません。たぶん)
[/pukiwiki]
[pukiwiki]
—-
(私が)Pythonで一番よく使う型はリスト(list)と辞書(dict)。
-[[辞書の説明 その1:http://www.gesource.jp/programming/python/code/0018.html]]
-[[辞書の説明 その2:http://www.pythonweb.jp/tutorial/dictionary/index.html]]
#蛇足ですが
x=dict(a=1,b=2,c=3) #例
x[d]=4
print x[“a”] ->1を出力
#こんなかんじ
他の言語だと、連想配列って用語で説明されることが多いかも。
で、ふと思いついて、ちょっと変な辞書を作ってみました。それは、、、
ありとあらゆる文字が載っている辞書w
といっても、格納されてない項目が要求されたときには、あらかじめ決めておいた値を返してくれるだけですけど。
—-
それだけなら、メソッドを使えばいいのですけれども。
dict.get( key ,default)
—-
別にジョークのためのジョークではなくて、MathematicaPlayerが返してくる値のパースに使う予定です。
Python2.5と IronPythonでテストが通りましたけれども、ひょっとすると実装依存かも。
—-
プログラムを書いてみて思ったのですが、eval関数は、なんとなく globals ー> localsの順に調べてる気がしなくも。 (CPythonのソース読んでないのでよくわからず)
てっきりスコープの内側から順に(ローカルを先に)調べると思ってました。
以下 書けたところまでコードをメモ
[/pukiwiki]
# -*- coding: utf8 -*- def through(*args,**argdict): if args and not argdict: return args elif not args and argdict : return argdict elif args and argdict : return [args,argdict] class Napoleon(dict): #我輩の辞書に不可能の文字は無い? #載ってない要素はretを返します def __init__(self,globals,locals,ret): self.update(globals) self.globals=globals self.locals=locals self.ret=ret def __getitem__(self,n): try: return eval(n,self.globals,self.locals) except NameError: return self.ret class Eval(object): def __init__(self,globals,locals): self.globals=globals self.locals=locals self.nap=Napoleon(globals,locals,through) def eval(self,source): return eval(source,self.globals,self.nap) #ここからはテストコード if __name__=="__main__": foo="bar" testlist=[ ["foo","bar"], ["hoge","fuga"], ["a[1]",2], ["x(y='z')",dict(y="z")], ["list((1,2,3))",[1,2,3]], ["Point([[1,2,3],[4,5,6]])",([[1,2,3],[4,5,6]],)], ["non(1,2,3)",(1,2,3)], ["eval('16')",16], ["hex(16)","0x10"], ["f(1)",(1,)] ] def f2(hoge,verbose=False): global ev a=[1,2,3] g=globals() ev=Eval(globals(),locals()) for i ,j in testlist: ret= ev.eval(i) if verbose : print "%s ->%s"%(i,ret) assert ret==j,j print "test done" ret=f2("fuga",verbose=False)
なんとなく、Napoleonっていうクラス名は違う気がする