【Py】 我輩の『辞書』に不可能な文字は。。。

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

コメントを残す

メールアドレスが公開されることはありません。