[Python-checkins] python/nondist/peps pep-0317.txt,1.1,1.2

goodger@users.sourceforge.net goodger@users.sourceforge.net
Sun, 08 Jun 2003 21:43:42 -0700


Update of /cvsroot/python/python/nondist/peps
In directory sc8-pr-cvs1:/tmp/cvs-serv6601

Modified Files:
	pep-0317.txt 
Log Message:
editorial tweaks

Index: pep-0317.txt
===================================================================
RCS file: /cvsroot/python/python/nondist/peps/pep-0317.txt,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pep-0317.txt	9 Jun 2003 04:04:31 -0000	1.1
--- pep-0317.txt	9 Jun 2003 04:43:39 -0000	1.2
***************
*** 18,22 ****
      is recommended (i.e. make an explicit call to the constructor)."
  
!                                     -- Guido van Rossum, in 1997 [1]_
  
  This PEP proposes the formal deprecation and eventual elimination of
--- 18,22 ----
      is recommended (i.e. make an explicit call to the constructor)."
  
!     -- Guido van Rossum, in 1997 [1]_
  
  This PEP proposes the formal deprecation and eventual elimination of
***************
*** 50,72 ****
  ==========
  
- 
  String Exceptions
  -----------------
  
  It is assumed that removing string exceptions will be uncontroversial,
! since it has been intended since at least Python 1.5, when the standard
! exception types were changed to classes [1]_.
  
  For the record: string exceptions should be removed because the
! presence of two kinds of exception complicates the language without any
! compensation.  Instance exceptions are superior because, for example,
  
! *   the class-instance relationship more naturally expresses the
!     relationship between the exception type and value,
  
! *   they can be organized naturally using superclass-subclass
!     relationships, and
  
! *   they can encapsulate error-reporting behaviour (for example).
  
  
--- 50,72 ----
  ==========
  
  String Exceptions
  -----------------
  
  It is assumed that removing string exceptions will be uncontroversial,
! since it has been intended since at least Python 1.5, when the
! standard exception types were changed to classes [1]_.
  
  For the record: string exceptions should be removed because the
! presence of two kinds of exception complicates the language without
! any compensation.  Instance exceptions are superior because, for
! example,
  
! * the class-instance relationship more naturally expresses the
!   relationship between the exception type and value,
  
! * they can be organized naturally using superclass-subclass
!   relationships, and
  
! * they can encapsulate error-reporting behaviour (for example).
  
  
***************
*** 79,84 ****
      "The raise statement has been extended to allow raising a class
      exception without explicit instantiation. The following forms,
!     called the "compatibility forms" of the raise statement [...]
!     The motivation for introducing the compatibility forms was to allow
      backward compatibility with old code that raised a standard
      exception."
--- 79,84 ----
      "The raise statement has been extended to allow raising a class
      exception without explicit instantiation. The following forms,
!     called the "compatibility forms" of the raise statement [...]  The
!     motivation for introducing the compatibility forms was to allow
      backward compatibility with old code that raised a standard
      exception."
***************
*** 93,145 ****
  
  When no such consideration obtains -- that is, when the desired
! exception type is not a string in any version of the software which the
! code must support -- there is no good reason to instantiate implicitly,
! and it is clearer not to.  For example:
  
! 1.  In the code ::
  
!         try:
!             raise MyError, raised
!         except MyError, caught:
!             pass
  
!     the syntactic parallel between the ``raise`` and ``except``
!     statements strongly suggests that ``raised`` and ``caught`` refer
!     to the same object.  For string exceptions this actually is the
!     case, but for instance exceptions it is not.
  
! 2.  When instantiation is implicit, it is not obvious when it occurs,
!     for example, whether it occurs when the exception is raised or when
!     it is caught.  Since it actually happens at the ``raise``, the code
!     should say so.
  
!     (Note that at the level of the C API, an exception can be "raised"
!     and "caught" without being instantiated; this is used as an
!     optimization by, for example, ``PyIter_Next``.  But in Python, no
!     such optimization is or should be available.)
  
! 3.  An implicitly instantiating ``raise`` statement with no arguments,
!     such as ::
  
         raise MyError
  
!     simply does not do what it says: it does not raise the named
!     object.
  
! 4.  The equivalence of ::
  
!         raise MyError
!         raise MyError()
  
!     conflates classes and instances, creating a possible source of
!     confusion for beginners.  (Moreover, it is not clear that the
!     interpreter could distinguish between a new-style class and an
!     instance of such a class, so implicit instantiation may be an
!     obstacle to any future plan to let exceptions be new-style
!     objects.)
  
! In short, implicit instantiation has no advantages other than backwards
! compatibility, and so should be phased out along with what it exists to
! ensure compatibility with, namely, string exceptions.
  
  
--- 93,145 ----
  
  When no such consideration obtains -- that is, when the desired
! exception type is not a string in any version of the software which
! the code must support -- there is no good reason to instantiate
! implicitly, and it is clearer not to.  For example:
  
! 1. In the code ::
  
!        try:
!            raise MyError, raised
!        except MyError, caught:
!            pass
  
!    the syntactic parallel between the ``raise`` and ``except``
!    statements strongly suggests that ``raised`` and ``caught`` refer
!    to the same object.  For string exceptions this actually is the
!    case, but for instance exceptions it is not.
  
! 2. When instantiation is implicit, it is not obvious when it occurs,
!    for example, whether it occurs when the exception is raised or when
!    it is caught.  Since it actually happens at the ``raise``, the code
!    should say so.
  
!    (Note that at the level of the C API, an exception can be "raised"
!    and "caught" without being instantiated; this is used as an
!    optimization by, for example, ``PyIter_Next``.  But in Python, no
!    such optimization is or should be available.)
  
! 3. An implicitly instantiating ``raise`` statement with no arguments,
!    such as ::
  
         raise MyError
  
!    simply does not do what it says: it does not raise the named
!    object.
  
! 4. The equivalence of ::
  
!        raise MyError
!        raise MyError()
  
!    conflates classes and instances, creating a possible source of
!    confusion for beginners.  (Moreover, it is not clear that the
!    interpreter could distinguish between a new-style class and an
!    instance of such a class, so implicit instantiation may be an
!    obstacle to any future plan to let exceptions be new-style
!    objects.)
  
! In short, implicit instantiation has no advantages other than
! backwards compatibility, and so should be phased out along with what
! it exists to ensure compatibility with, namely, string exceptions.
  
  
***************
*** 166,172 ****
  
  The raised object must be an instance.  The class of the instance is
! the exception type, and the instance itself is the exception value.  If
! the raised object is not an instance -- for example, if it is a class
! or string -- a ``TypeError`` is raised.
  
  If the substituted traceback is not ``None``, it must be a traceback
--- 166,172 ----
  
  The raised object must be an instance.  The class of the instance is
! the exception type, and the instance itself is the exception value.
! If the raised object is not an instance -- for example, if it is a
! class or string -- a ``TypeError`` is raised.
  
  If the substituted traceback is not ``None``, it must be a traceback
***************
*** 179,187 ****
  =======================
  
- 
  Migration Plan
  --------------
  
- 
  Future Statement
  ''''''''''''''''
--- 179,185 ----
***************
*** 204,213 ****
  
  Three new warnings [5]_, all of category ``DeprecationWarning``, are
! to be issued to point out uses of ``raise`` which will become incorrect
! under the proposed changes.
  
  The first warning is issued when a ``raise`` statement is executed in
! which the first expression evaluates to a string.  The message for this
! warning is::
  
      raising strings will be impossible in the future
--- 202,211 ----
  
  Three new warnings [5]_, all of category ``DeprecationWarning``, are
! to be issued to point out uses of ``raise`` which will become
! incorrect under the proposed changes.
  
  The first warning is issued when a ``raise`` statement is executed in
! which the first expression evaluates to a string.  The message for
! this warning is::
  
      raising strings will be impossible in the future
***************
*** 233,237 ****
  --------
  
- 
  Code Using Implicit Instantiation
  '''''''''''''''''''''''''''''''''
--- 231,234 ----
***************
*** 277,282 ****
      raise MyError, 'spam', mytraceback
  
! will issue a warning when compiled.  The statement should be changed to
! ::
  
      raise MyError('spam'), mytraceback
--- 274,279 ----
      raise MyError, 'spam', mytraceback
  
! will issue a warning when compiled.  The statement should be changed
! to ::
  
      raise MyError('spam'), mytraceback
***************
*** 286,292 ****
      from __future__ import raise_with_two_args
  
! should be added at the top of the module.  Note that adding this future
! statement also turns the other two warnings into errors, so the changes
! described in the previous examples must also be applied.
  
  The special case ::
--- 283,289 ----
      from __future__ import raise_with_two_args
  
! should be added at the top of the module.  Note that adding this
! future statement also turns the other two warnings into errors, so the
! changes described in the previous examples must also be applied.
  
  The special case ::
***************
*** 304,312 ****
  
  It may occur that a ``raise`` statement which raises a string or
! implicitly instantiates is not executed in production or testing during
! the phase-in period for this PEP.  In that case, it will not issue any
! warnings, but will instead suddenly fail one day in Python 3.0 or a
! subsequent version.  (The failure is that the wrong exception gets
! raised, namely a ``TypeError`` complaining about the arguments to
  ``raise``, instead of the exception intended.)
  
--- 301,309 ----
  
  It may occur that a ``raise`` statement which raises a string or
! implicitly instantiates is not executed in production or testing
! during the phase-in period for this PEP.  In that case, it will not
! issue any warnings, but will instead suddenly fail one day in Python
! 3.0 or a subsequent version.  (The failure is that the wrong exception
! gets raised, namely a ``TypeError`` complaining about the arguments to
  ``raise``, instead of the exception intended.)