Re: [Python-Dev] PEP 348: Exception Reorganization for Python 3.0
Guido van Rossum wrote: > The point is not to avoid bare 'except:' from hiding programming > errors. There's no hope to obtain that goal. > > The point is to make *legitimate* uses of bare 'except:' easier -- the > typical use case is an application that has some kind of main loop > which uses bare 'except:' to catch gross programming errors in other > parts of the app, or in code received from an imperfect source (like > an end-user script) and recovers by logging the error and continuing. > (I was going to say "or clean up and exit", but that use case is > handled by 'finally:'.) > > Those legitimate uses often need to make a special case of > Keyboardinterrupt and SystemExit -- KeyboardInterrupt because it's not > a bug in the code but a request from the user who is *running* the app > (and the appropriate default response is to exit with a stack trace); > SystemExit because it's not a bug but a deliberate attempt to exit the > program -- logging an error would be a mistake. > > I think the use cases for moving other exceptions out of the way are > weak; MemoryError and SystemError are exceedingly rare and I've never > felt the need to exclude them; when GeneratorExit or StopIteration > reach the outer level of an app, it's a bug like all the others that > bare 'except:' WANTS to catch. To try to turn this idea into a concrete example, the idea would be to make the following code work correctly: for job in joblist: try: job.exec() except: # or "except Exception:" failed_jobs.append((job, sys.exc_info())) Currently, this code will make a user swear, as Ctrl-C will cause the program to move onto the next job, instead of exiting as you would except (I have found Python scripts not exiting when I press Ctrl-C to be an all-too-common problem). Additionally calling sys.exit() inside a job will fail. This may be deliberate (to prevent a job from exiting the whole application), but given only the code above, it looks like a bug. The program will attempt to continue in the face of a MemoryError. This is actually reasonable, as memory may have been freed as the stack unwound to the level of the job execution loop, or the request that failed may have been for a ridicuolously large amount of memory. The program will also attempt to continue in the face of a SystemError. This is reasonable too, as SystemError is only used when the VM thinks the current operation needs to be aborted due to an internal problem in the VM, but the VM itself is still safe to use. If the VM thinks something is seriously wrong with the internal data structures, it will kill the process with Py_FatalError (to ensure that no further Python code is executed), rather than raise SystemError. As others have pointed out, GeneratorExit and StopIteration should never reach the job execution loop - if they do, there's a bug in the job, and they should be caught and logged. That covers the six exceptions that have been proposed to be moved out from under "Exception", and, as I see it, only two of them end up making the grade - SystemExit and KeyboardInterrupt, for exactly the reasons Guido gives in his message above. This suggests a Py3k exception hierarchy that looks like: BaseException +-- CriticalException +-- SystemExit +-- KeyboardInterrupt +-- Exception +-- GeneratorExit +-- (Remainder as for Python 2.4, other than KeyboardInterrupt) With a transitional 2.x hierarchy that looks like: BaseException +-- CriticalException +-- SystemExit +-- KeyboardInterrupt +-- Exception +-- GeneratorExit +-- (Remainder exactly as for Python 2.4) The reason for the CriticalException parent is that Python 2.x code can be made 'correct' by doing: try: # whatever except CriticalException: raise except: # or 'except Exception' # Handle everything non-critical And, the hypothetical job execution loop above can be updated to: for job in joblist: try: job.exec() except CriticalException: failed_jobs.append((job, sys.exc_info())) job_idx = joblist.find(job) skipped_jobs.extend(joblist[job_idx+1:] raise except: # or "except Exception:" failed_jobs.append((job, sys.exc_info())) To tell the truth, if base except is kept around for Py3k, I would prefer to see it catch BaseException rather than Exception. Failing that, I would prefer to see it removed. Having it catch something other than the root of the exception hierarchy would be just plain confusing. Moving SystemExit and KeyboardInterrupt is the only change we've considered which seems to have a genuine motivating use case. The rest of the changes suggested don't seem to be solving an actual problem (or are solving a problem that is minor enough to be not worth any backward compatibility pain). Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia -
[Python-Dev] PEP: Generalised String Coercion
The title is perhaps a little too grandiose but it's the best I could think of. The change is really not large. Personally, I would be happy enough if only %s was changed and the built-in was not added. Please comment. Neil PEP: 349 Title: Generalised String Coercion Version: $Revision: 1.2 $ Last-Modified: $Date: 2005/08/06 04:05:48 $ Author: Neil Schemenauer <[EMAIL PROTECTED]> Status: Draft Type: Standards Track Content-Type: text/plain Created: 02-Aug-2005 Post-History: 06-Aug-2005 Python-Version: 2.5 Abstract This PEP proposes the introduction of a new built-in function, text(), that provides a way of generating a string representation of an object without forcing the result to be a particular string type. In addition, the behavior %s format specifier would be changed to call text() on the argument. These two changes would make it easier to write library code that can be used by applications that use only the str type and by others that also use the unicode type. Rationale Python has had a Unicode string type for some time now but use of it is not yet widespread. There is a large amount of Python code that assumes that string data is represented as str instances. The long term plan for Python is to phase out the str type and use unicode for all string data. Clearly, a smooth migration path must be provided. We need to upgrade existing libraries, written for str instances, to be made capable of operating in an all-unicode string world. We can't change to an all-unicode world until all essential libraries are made capable for it. Upgrading the libraries in one shot does not seem feasible. A more realistic strategy is to individually make the libraries capable of operating on unicode strings while preserving their current all-str environment behaviour. First, we need to be able to write code that can accept unicode instances without attempting to coerce them to str instances. Let us label such code as Unicode-safe. Unicode-safe libraries can be used in an all-unicode world. Second, we need to be able to write code that, when provided only str instances, will not create unicode results. Let us label such code as str-stable. Libraries that are str-stable can be used by libraries and applications that are not yet Unicode-safe. Sometimes it is simple to write code that is both str-stable and Unicode-safe. For example, the following function just works: def appendx(s): return s + 'x' That's not too surprising since the unicode type is designed to make the task easier. The principle is that when str and unicode instances meet, the result is a unicode instance. One notable difficulty arises when code requires a string representation of an object; an operation traditionally accomplished by using the str() built-in function. Using str() makes the code not Unicode-safe. Replacing a str() call with a unicode() call makes the code not str-stable. Using a string format almost accomplishes the goal but not quite. Consider the following code: def text(obj): return '%s' % obj It behaves as desired except if 'obj' is not a basestring instance and needs to return a Unicode representation of itself. In that case, the string format will attempt to coerce the result of __str__ to a str instance. Defining a __unicode__ method does not help since it will only be called if the right-hand operand is a unicode instance. Using a unicode instance for the right-hand operand does not work because the function is no longer str-stable (i.e. it will coerce everything to unicode). Specification A Python implementation of the text() built-in follows: def text(s): """Return a nice string representation of the object. The return value is a basestring instance. """ if isinstance(s, basestring): return s r = s.__str__() if not isinstance(r, basestring): raise TypeError('__str__ returned non-string') return r Note that it is currently possible, although not very useful, to write __str__ methods that return unicode instances. The %s format specifier for str objects would be changed to call text() on the argument. Currently it calls str() unless the argument is a unicode instance (in which case the object is substituted as is and the % operation returns a unicode instance). The following function would be added to the C API and would be the equivalent of the text() function: PyObject *PyObject_Text(PyObject *o); A reference implementation is available on Sourceforge [1] as a patch. Backwards Compatibility The change to the %s format specifier w
[Python-Dev] PEP 8: exception style
PEP 8 doesn't express any preference between the two forms of raise statements: raise ValueError, 'blah' raise ValueError("blah") I like the second form better, because if the exception arguments are long or include string formatting, you don't need to use line continuation characters because of the containing parens. Grepping through the library code, the first form is in the majority, used roughly 60% of the time. Should PEP 8 take a position on this? If yes, which one? --amk ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 348: Exception Reorganization for Python 3.0
[Nick Coghlan] > As others have pointed out, GeneratorExit and StopIteration should never > reach > the job execution loop - if they do, there's a bug in the job, and they > should > be caught and logged. Please read my other, detailed post on this (8/5/2005 4:05pm). It is a mistake to bypass control flow exceptions like GeneratorExit and StopIteration. Those need to remain under Exception. Focus on your core use case of eliminating the common idiom: try: block() except KeyboardInterrupt: raise except: pass# or some handler/logger In real code, I've never seen the above idiom used with StopIteration. Read Guido's note and my note. There are plenty of valid use cases for a bare except intending to catch almost everything including programming errors from NameError to StopIteration. It is a consenting-adults construct. Your proposal breaks a major use case for it (preventing your sales demos from crashing in front of your customers, writing fault-tolerant programs, etc.) Raymond ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 8: exception style
A.M. Kuchling wrote: > PEP 8 doesn't express any preference between the > two forms of raise statements: > raise ValueError, 'blah' > raise ValueError("blah") > > I like the second form better, because if the exception arguments are > long or include string formatting, you don't need to use line > continuation characters because of the containing parens. Grepping > through the library code, the first form is in the majority, used > roughly 60% of the time. > > Should PEP 8 take a position on this? If yes, which one? I like the second form better, because even intermediate Pythonistas sometimes make a mistake between: raise ValueError, A and raise (ValueError, A) I'd like to see the first form removed in Python 3k, to help reduce the ambiguity. But PEP 8 taking a stand on it would be a good start for now. Robert Brewer System Architect Amor Ministries [EMAIL PROTECTED] ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 8: exception style
On 8/6/05, A.M. Kuchling <[EMAIL PROTECTED]> wrote: > PEP 8 doesn't express any preference between the > two forms of raise statements: > raise ValueError, 'blah' > raise ValueError("blah") > > I like the second form better, because if the exception arguments are > long or include string formatting, you don't need to use line > continuation characters because of the containing parens. Grepping > through the library code, the first form is in the majority, used > roughly 60% of the time. > > Should PEP 8 take a position on this? If yes, which one? Definitely ValueError('blah'). The other form will go away in Python 3000. Please update the PEP. -- --Guido van Rossum (home page: http://www.python.org/~guido/) ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
[Python-Dev] FW: PEP 8: exception style
> PEP 8 doesn't express any preference between the > two forms of raise statements: > raise ValueError, 'blah' > raise ValueError("blah") > > I like the second form better, because if the exception arguments are > long or include string formatting, you don't need to use line > continuation characters because of the containing parens. Grepping > through the library code, the first form is in the majority, used > roughly 60% of the time. > > Should PEP 8 take a position on this? If yes, which one? I we had to pick one, I would also choose the second form. But why bother inflicting our preference on others, both forms are readable so we won't gain anything by dictating a style. Raymond ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] FW: PEP 8: exception style
[AMK] >> PEP 8 doesn't express any preference between the >> two forms of raise statements: >> raise ValueError, 'blah' >> raise ValueError("blah") >> >> I like the second form better, because if the exception arguments are >> long or include string formatting, you don't need to use line >> continuation characters because of the containing parens. Grepping >> through the library code, the first form is in the majority, used >> roughly 60% of the time. >> >> Should PEP 8 take a position on this? If yes, which one? [Raymond Hettinger] > I we had to pick one, I would also choose the second form. But why > bother inflicting our preference on others, both forms are readable so > we won't gain anything by dictating a style. Ongoing cruft reduction -- TOOWTDI. The first form was necessary at Python's start because exceptions were strings, and strings aren't callable, and there needed to be _some_ way to spell "and here's the detail associated with the exception". "raise" grew special syntax to support that need. In a Python without string exceptions, that syntax isn't needed, and becomes (over time) an increasingly obscure way to invoke an ordinary constructor -- ValueError("blah") does exactly the same thing in a raise statement as it does in any other context, and transforming `ValueError, 'blah'` into the former becomes a wart unique to raise statements. ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 8: exception style
"Guido van Rossum" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > On 8/6/05, A.M. Kuchling <[EMAIL PROTECTED]> wrote: >> PEP 8 doesn't express any preference between the >> two forms of raise statements: >> raise ValueError, 'blah' >> raise ValueError("blah") >> >> I like the second form better, because if the exception arguments are >> long or include string formatting, you don't need to use line >> continuation characters because of the containing parens. Grepping >> through the library code, the first form is in the majority, used >> roughly 60% of the time. >> >> Should PEP 8 take a position on this? If yes, which one? > > Definitely ValueError('blah'). The other form will go away in Python > 3000. Please update the PEP. Great. PEP 3000 could also be updated to add the line The raise Error,'blah' syntax: use raise Error('blah') instead [14] in the To be removed section after the line on string exceptions and [14] under references. Terry J. Reedy ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Generalised String Coercion
> PEP: 349 > Title: Generalised String Coercion ... > Rationale >Python has had a Unicode string type for some time now but use of >it is not yet widespread. There is a large amount of Python code >that assumes that string data is represented as str instances. >The long term plan for Python is to phase out the str type and use >unicode for all string data. This PEP strikes me as premature, as putting the toy wagon before the horse, since it is premised on a major change to Python, possibly the most disruptive and controversial ever, being a done deal. However there is, as far as I could find no PEP on Making Strings be Unicode, let alone a discussed, debated, and finalized PEP on the subject. > Clearly, a smooth migration path must be provided. Of course. But the path depends on the detailed final target, which has not, as far as I know, has been finalized, and certainly not in the needed PEP. Your proposal might be part of the transition section of such a PEP or of a separate migration path PEP. Terry J. Reedy ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 8: exception style
On 8/6/05, Guido van Rossum <[EMAIL PROTECTED]> wrote: > On 8/6/05, A.M. Kuchling <[EMAIL PROTECTED]> wrote: > > PEP 8 doesn't express any preference between the > > two forms of raise statements: > > raise ValueError, 'blah' > > raise ValueError("blah") > > > > I like the second form better, because if the exception arguments are > > long or include string formatting, you don't need to use line > > continuation characters because of the containing parens. Grepping > > through the library code, the first form is in the majority, used > > roughly 60% of the time. > > > > Should PEP 8 take a position on this? If yes, which one? > > Definitely ValueError('blah'). The other form will go away in Python > 3000. Please update the PEP. > Done. rev. 1.18 . -Brett ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 348: Exception Reorganization for Python 3.0
Raymond Hettinger wrote: > Please read my other, detailed post on this (8/5/2005 4:05pm). It is a > mistake to bypass control flow exceptions like GeneratorExit and > StopIteration. Those need to remain under Exception. This is the paragraph after the one you replied to above: [Nick Coghlan] >> That covers the six exceptions that have been proposed to be moved out >> from under "Exception", and, as I see it, only two of them end up making >> the grade - SystemExit and KeyboardInterrupt, for exactly the reasons >> Guido gives in his message above. The remainder of my message then goes on to describe a hierarchy just as you suggest - SystemError, MemoryError, StopIteration and GeneratorExit are all still caught by "except Exception:". The only two exceptions which are no longer caught by "except Exception:" are KeyboardInterrupt and SystemExit. Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --- http://boredomandlaziness.blogspot.com ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Generalised String Coercion
[Removed python-list CC] On 8/6/05, Terry Reedy <[EMAIL PROTECTED]> wrote: > > PEP: 349 > > Title: Generalised String Coercion > ... > > Rationale > >Python has had a Unicode string type for some time now but use of > >it is not yet widespread. There is a large amount of Python code > >that assumes that string data is represented as str instances. > >The long term plan for Python is to phase out the str type and use > >unicode for all string data. > > This PEP strikes me as premature, as putting the toy wagon before the > horse, since it is premised on a major change to Python, possibly the most > disruptive and controversial ever, being a done deal. However there is, as > far as I could find no PEP on Making Strings be Unicode, let alone a > discussed, debated, and finalized PEP on the subject. True. OTOH, Jython and IreonPython already have this, and it is my definite plan to make all strings Unicode in Python 3000. The rest (such as a bytes datatype) is details, as they say. :-) My first response to the PEP, however, is that instead of a new built-in function, I'd rather relax the requirement that str() return an 8-bit string -- after all, int() is allowed to return a long, so why couldn't str() be allowed to return a Unicode string? The main problem for a smooth Unicode transition remains I/O, in my opinion; I'd like to see a PEP describing a way to attach an encoding to text files, and a way to decide on a default encoding for stdin, stdout, stderr. -- --Guido van Rossum (home page: http://www.python.org/~guido/) ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] PEP 348: Exception Reorganization for Python 3.0
> The remainder of my message then goes on to describe a hierarchy just as > you > suggest - SystemError, MemoryError, StopIteration and GeneratorExit are > all > still caught by "except Exception:". The only two exceptions which are no > longer caught by "except Exception:" are KeyboardInterrupt and SystemExit. Ah, I was too quick on the draw. It now appears that you were already converted :-) Now, if only the PEP would get updated ... BTW, why did you exclude MemoryError? Raymond ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
[Python-Dev] Major revision of PEP 348 committed
Version 1.5 of PEP 348 (http://www.python.org/peps/pep-0348.html) just got checked in. This one is a *big* change compared to the previous version: * Renamings removed * SystemExit are the KeyboardInterrupt are the only exceptions *not* inheriting from Exception + CriticalException has been renamed TerminalException so it is more inline with the idea that the exceptions are meant to terminate the interpreter, not that they are more critical than other exceptions * Removed ControlFlowException + StopIteration and GeneratorExit inherit from Exception directly * Added VMError which inherits Exception + SystemError and MemoryError subclass VMError * Removed UnboundG(Global|Free)Error * other stuff I don't remember This version addresses everyone's worries about backwards-compatibility or changes that were not substantive enough to break code. The things I did on my own without thorough discussion is remove ControlFlowException and introduce VMError. The former seemed reasonable since catching control flow exceptions as a group is probably rare and with StopIteration and GeneratorExit not falling outside of Exception, ControlFlowException lost its usefulness. VMError was introduced to allow the grouping of MemoryError and SystemError since they are both exceptions relating to the VM. The name can be changed to InterpreterError, but VMError is shorter while still getting the idea across. Plus I just like VMError more. =) OK, guys, have at it. -Brett ___ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com