On 11/03/12 19:04, bvdp wrote: > Which is preferred in a raise: X or X()? I've seen both. In my specific case > I'm dumping out of a deep loop: > > try: > for ... > for ... > for ... > if match: > raise StopInteration() > else ... > > except StopInteration: > print "found it"
I wonder whether you need to use an exception here rather than a yield statement? Exceptions should reflect Exceptional circumstances (and come with associated stack trace, and so on...). The following should do something like what you want, without raising exceptions. >>> # Deeply loop into a collection of collections >>> def find(collection): ... for sub_col in collection: ... for item in sub_col: ... for foo in item.list_field: ... if foo.is_match: ... yield foo >>> # Some junk classes to iterate over >>> class Item(object): ... def __init__(self, some_range): ... self.list_field = [ListedItem(i) for i in some_range] >>> class ListedItem(object): ... def __init__(self, number): ... self.tag = number ... self.is_match = False >>> def __str__(self): ... return str(self.tag) >>> # Construct a list of items >>> l = [[Item(range(i)) for i in range(10)], ... [Item(range(i, 2*i)) for i in range(10,20)]] >>> l[0][9].list_field[3].is_match = True >>> for i in find(l): ... print(i) 3 James -- http://mail.python.org/mailman/listinfo/python-list