2016-09-22 5 views
1

Pythonは、dictfor...in...という構文で入力するとキーリストを返すだけです。Pythonでdictをループするとどうなりますか

しかし、何がdictに起こりますか?

help(dict)を使用すると、メソッドリストに__next()__メソッドが表示されません。だから私はdictに基づいて派生クラスを作成したい場合:

class MyDict(dict) 
    def __init__(self, *args, **kwargs): 
     super(MyDict, self).__init__(*args, **kwargs) 

for...in...

d = Mydict({'a': 1, 'b': 2}) 
for value in d: 

私は何をすべきと値のリストを返しますか?

+2

なぜ 'dict'に' __next__'があるのですか? '__iter__'を持ち、その関数が返すオブジェクトは' next'をサポートしています。あなたのクラス 'MyClass'は基本クラス' dict'から '__iter__'を継承しているので、' dict'と同じ動作をします。 –

+1

これはあなたや他の人たちを混乱させるかもしれません。だれかがキーを反復することを期待しています。突然ここで値を取得します(たとえ変数の名前が 'value'でも)。代わりに、代わりに 'for value in d.values()'を使用してください。それは何が起きているのかは間違いありません。 – Evert

+0

私は 'yield'キーワードと[Generators](https://wiki.python.org/moin/Generators)があなたが探しているものと信じています。 – Maurice

答えて

0

単純に、あなたが望むすべての値の代わりにキーを生成するためにMyClassのインスタンス上で反復のためであれば、その後、MyClassに定義する:Pythonの3では

def __iter__(self): 
    return self.itervalues() 

を:

def __iter__(self): 
    return iter(self.values()) 

しかし、注意!これにより、issubclass(MyClass, collections.MutableMapping)がTrueであっても、クラスはcollections.MutableMappingという契約を実装しなくなりました。 サブクラス化dictが望ましい動作である場合は、代わりにデータを保持する型の属性がdictであり、必要な関数と演算子のみを実装する方がよい場合があります。

関連する問題