[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っていうクラス名は違う気がする