[Python-ideas] thoughts on generator.throw()
solipsis at pitrou.net
Wed Mar 18 18:20:11 CET 2009
Gerald Britton <gerald.britton at ...> writes:
> But then I
> saw that it would have been impossible to implement since "raise" is a
> Python keyword. *Then* I wondered why "raise" is a keyword and not a
> function. If it were a function you could use it easily in places
> where today you cannot:
> if 'foo' == 'bar' or raise(FooBar): # only proceed if 'foo'
> equals 'bar' otherwise raise FooBar exception
I find this horrible, awfully Perlish. Non-local control transfers should stick
out clearly when reading source code, not be hidden at the end of a conditional.
As for why raise is a keyword, I think there are several explanations:
- raise is a control flow operation, as are "return", "continue", "break" and
- raise has to create a traceback capturing the current frame stack, which is
easier with a dedicated bytecode.
- raise should be decently fast, which is easier with a dedicated bytecode.
> I have a similar question about the "assert" statement. It could
> possibly benefit from being a function instead.
I think the point is that assert is entirely a no-op when the interpreter is run
with "-O", while there would be a significant overhead if it was a regular
But I agree that the situation is less clear-cut than with the raise statement.
More information about the Python-ideas