自分用メモ。 ほかの人が読むと目が腐ります。。。
その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などを使うほうがよいのかもしれませんけれども。