3

多くのリストがあり、それらの各リストの値が有効な値のセットである必要がある状況があります。ただし、有効な値のセットはリストごとに異なります。したがって、これらのリストへの追加を行う前に、メンバーシップを確認する必要があり、これにより多くのコードが繰り返されます。メンバーシップ チェックを何度も行う必要がないように、リスト オブジェクトを拡張したいと思っています。

class Attribute(list):
    def __init__(self,validList):
        self.valid = validList

    def append(self,inString):
        if inString not in self.valid:
            raise Exception, '%s is not a valid value for this attribute' % inString
        if inString not in self:
            super(Attribute,self).append(inString)

そうすれば、リストごとに異なる有効な値のセットを持つことができます。ただし、組み込みオブジェクトを拡張することはあまり良い考えではないと感じており、過去にはそれを避けてきました。だから私の質問は

  1. これを行う組み込みの方法はありますか、それともすでにこのようなものを持っているライブラリがありますか?
  2. これは悪い考えですか?このようなことを行うと、どのような問題が発生する可能性がありますか?

Python List から継承した後に append メソッドをオーバーライドすると、このコードを機能させるのに役立ちました。

4

1 に答える 1

2

どちらの方法でもよいと思いますが、通常、リストをサブクラス化することは避けます。たとえば、サブクラス化するのではなく、独自のコレクション オブジェクトを作成する場合があります。

あなたの場合、各リストをフィルタリングしてメンバーシップを確認します。巨大なレコードセットを扱っていない限り、おそらく問題にはなりません。

list.append(1)
list.append(2)
list.append(3)
# list = [1, 2, 3]

valid_values = (2, 3)

list = [item for item in list if item in valid_values]
# list = [2, 3] now

追加が機能しない理由についての質問については、リスト項目ではなくリストを追加しようとしているためです。にすることでこれを修正できますlist.append(inString)。ある時点で実際にリストを結合したい場合は、list.extend(other_list)またはを使用できますlist + other_list

ちなみに、Python のほとんどの人は、読みやすくするために PEP-8 構文に従っています。つまりinString、 という名前になりin_stringます。

于 2013-07-03T16:38:09.950 に答える