私はPythonスライスオブジェクトにいくつかのメタデータを追加し、スライス内の各要素のインデックスを示す変数を追加したいと思います。メタデータは、スライスが取得している各要素にラベルを付けるために使用されます。私は使用できる他のラベル付けされたデータ構造があることを知っていますが、私のプロジェクトでは、スライスはnumpy配列用の一種の下付き文字としてあらかじめ定義され、さまざまな場所で再利用されています。それで、私にとっては、これを組み込む方法を見つけることが理にかなっています。Pythonスライスオブジェクトまたはサブクラスを模倣することは可能ですか?
私はslice
のサブクラス化を考えていましたが、明らかにリンクされた質問の答えで明確に説明されたsubclassedになることはできません。それ以来何か変わったことはありますか?
class Subscript:
def __init__(self, start, stop, step=None, labels=None):
self.labels = labels
self.slc = slice(start, stop, step)
for i, l in zip(range(start, stop, step), labels):
setattr(self, l, i)
とこのようにそれを使用することができる::私がやりたいのは何
は次のようになりますクラスを作成している
sub = Subscript(0, 5, labels=['s0', 's1', 's2', 's3', 's4'])
list(range(10))[sub] # [0, 1, 2, 3, 4]
range(10)[sub.s0] # 0
はせずにこれを行う方法がありますスライスを返すために__call__
メソッドを追加する必要がありますか?どういうわけか私はこれを疑っています。sub
から__getitem__
までを取っているアレイまたはリストは、これと何をするべきかわからないからです。私はおそらく、この情報をslice
に猿パッチすることができますが、このタイプのことがクラスでできるかどうか疑問に思っています。
現在、私は次のように個別にスライスし、スライスの要素を定義しています:
sub = slice(0, 5)
s0, s1, s2, s3, s4 = range(5)
しかし、このアプローチは、それははるかに困難キーが添字の要素の組み合わせは、ケース内にある辞書に多次元配列の出力を処理することができます1 sub
より大きく、値は1d配列です。
属性を動的に設定するために 'exec'を使用しないでください。' setattr'はこれにはるかに適しています。また、 '__init__'には' self'がありません。 – vaultah
ありがとう!その1つを忘れた – pbreach