On Fri, Oct 1, 2021 at 3:02 PM Steven D'Aprano <st...@pearwood.info> wrote: > We might take the point of view that StopIteration is reserved for use > by iterators, and that the interpreter reserves the use to treat *any* > use of StopIteration in any other context as undefined behaviour, and > that we ought to be grateful that the interpreter merely converts it to > a RuntimeError instead of making demons fly out of your nose. > > http://catb.org/jargon/html/N/nasal-demons.html > > So I don't think we should be too gung-ho about generalising from > StopIteration (a specific exception used by the interpreter for flow > control) to arbitrary exceptions which represent error conditions.
If you want to generalise StopIteration at all, the next closest would be AttributeError, which exists so that getattr and __getattr__ can return any object whatsoever, or can signal "there is no object to return". But there's no equivalent of generators for them, or if there is, it is generators themselves: def __getattr__(self, attr): for value in self.__getattr_gen__(attr): return attr raise AttributeError def __getattr_gen__(self, attr): if attr.startswith("spam"): yield "ham" + attr[4:] You could argue that, now, an AttrributeError inside the gen function should be turned into RuntimeError. But that just brings us right back to context managers or try/except: def __getattr_(self, attr): try: for value in self.__getattr_gen__(attr): return attr except AttributeError: raise RuntimeError("Exception leaked from implementation function") raise AttributeError("Attribute not found: " + str(attr)) So ultimately, the true specialness of StopIteration is actually generators, not flow control. (Also: If anyone implements "pip install nasal-demons", I would be very curious as to its hardware requirements.) ChrisA _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/DI6STW2RJ2RJH3NTHUUV45KUUVZGVDSZ/ Code of Conduct: http://python.org/psf/codeofconduct/