Pythonで名前つきリスト その2

自分用メモ。 ほかの人が読むと目が腐ります。。。

その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などを使うほうがよいのかもしれませんけれども。

コメントを残す

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