自分用メモ。 ほかの人が読むと目が腐ります。。。
その1を少し改造したもの。手元のスクリプトでよく使うので、blogにも保存。
かなり昔書いたモジュールなので、今 見ると変な書き方も多いかも。
zlibを使って名寄せなどで使っています。
(今、ほかのマシンでこのモジュールを動かそうとしたらmycollectionsが足りないことに気がついた。)
今からスクリプトを書くのであれば
2.7以降なら OrderedDict
2.6以前なら prdereddictモジュールを使うのが良いと思います。
名前付きリストモジュール。
リストを継承したクラスですが、インデックスとして数値だけでなく名前を使えるように拡張してあります。
使い方は namedtupleっぽい感じで。
#"namedtuple.py" def namedtuple(tname,tmemberstr): __t=tmemberstr.split() __a=",".join(__t) class _(tuple): exec "def __new__(cls, %s):return tuple.__new__(cls,(%s))"%(__a,__a) exec "def __init__(self, %s):tuple.__init__(self,(%s))"%(__a,__a) def __get__(self,x): return self[__t.index(x)] for m in __t : setattr(_,m,property(lambda self,p=m:self.__get__(p))) _.__name__=tname return _ def namedlist(lname,lmemberstr): __m=lmemberstr.split() __ka="=0,".join(__m)+"=0" __a=",".join(__m) __idx=dict(zip(__m,range(len(__m)))) __sep=[":",]*len(__m) class _(list): exec "def __new__(cls, %s):return list.__new__(cls,[%s])"%(__ka,__a) exec "def __init__(self, %s):list.__init__(self,[%s])"%(__ka,__a) def __get__(self,x): return self[__idx[x]] @classmethod def getp(cls,x,p): return x[cls.__idx[p]] @classmethod def indexp(cls,p): return cls.__idx[p] def __set__(self,x,v): self[__idx[x]]=v for m in __m : setattr(_,m,property(lambda self,p=m:self.__get__(p), lambda self,v,p=m:self.__set__(p,v))) _.__member=__m _.__idx=__idx _.__name__=lname return _ ################# # ここから下はテスト的な何か # 未だに ちゃんとしたテストの書き方がよくわかりません。 ################# if __name__=="__main__": """ X=namedlist("X","a b c") x=X(1,2,3) print "x",x print "x.a",x.a print "x.b",x.b print "x.c",x.c print "x[0]",x[0] print "x[:]",x[:] x.a=100 x.b*=100 x[-1]=300 print x """ Pos3d=namedlist("Pos3d","x y z") p=Pos3d() print p X=namedlist("X","a b c") x=X(1,2,3) print "x",x print "x.a",x.a print "x.b",x.b print "x.c",x.c print "x[0]",x[0] print "x[:]",x[:] x.a=100 x.b*=100 x[-1]=300 print "x",x print "list(x)",list(x) print "x[:]=[1,2,3][:]" x[:]=[1,2,3][:] print "x",x print "x.a x.b x.c",x.a,x.b,x.c print "x.indexp('a'),x.indexp('b'),x.indexp('c')" print x.indexp('a'),x.indexp('b'),x.indexp('c')
こういうスニペットを保存するにはgithubなどを使うほうがよいのかもしれませんけれども。