をサポートするクラスを定義したいのですが__getitem__
、反復は許可されません。例えば:
class B:
def __getitem__(self, k):
return k
cb = B()
for x in cb:
print x
B
強制的for x in cb:
に失敗させるには、クラスに何を追加できますか?
をサポートするクラスを定義したいのですが__getitem__
、反復は許可されません。例えば:
class B:
def __getitem__(self, k):
return k
cb = B()
for x in cb:
print x
B
強制的for x in cb:
に失敗させるには、クラスに何を追加できますか?
少し良い解決策は、単純な例外ではなく TypeError を発生させることだと思います(これは通常、反復不可能なクラスで発生します:
class A(object):
# show what happens with a non-iterable class with no __getitem__
pass
class B(object):
def __getitem__(self, k):
return k
def __iter__(self):
raise TypeError('%r object is not iterable'
% self.__class__.__name__)
テスト:
>>> iter(A())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'A' object is not iterable
>>> iter(B())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "iter.py", line 9, in __iter__
% self.__class__.__name__)
TypeError: 'B' object is not iterable
この質問への回答から、 __iter__ が存在する場合は __getitem__ の前に呼び出されることがわかります。そのため、単純に B を次のように定義します。
class B:
def __getitem__(self, k):
return k
def __iter__(self):
raise Exception("This class is not iterable")
それで:
cb = B()
for x in cb: # this will throw an exception when __iter__ is called.
print x