restify PEP 349 (#148)

This commit is contained in:
Mariatta 2016-12-03 16:03:37 -08:00 committed by Brett Cannon
parent 26b4086667
commit 4e21b23c38
1 changed files with 102 additions and 94 deletions

View File

@ -5,23 +5,25 @@ Last-Modified: $Date$
Author: Neil Schemenauer <nas@arctrix.com> Author: Neil Schemenauer <nas@arctrix.com>
Status: Deferred Status: Deferred
Type: Standards Track Type: Standards Track
Content-Type: text/plain Content-Type: text/x-rst
Created: 02-Aug-2005 Created: 02-Aug-2005
Python-Version: 2.5 Python-Version: 2.5
Post-History: 06-Aug-2005 Post-History: 06-Aug-2005
Abstract Abstract
========
This PEP proposes to change the str() built-in function so that it This PEP proposes to change the ``str()`` built-in function so that it
can return unicode strings. This change would make it easier to can return unicode strings. This change would make it easier to
write code that works with either string type and would also make write code that works with either string type and would also make
some existing code handle unicode strings. The C function some existing code handle unicode strings. The C function
PyObject_Str() would remain unchanged and the function ``PyObject_Str()`` would remain unchanged and the function
PyString_New() would be added instead. ``PyString_New()`` would be added instead.
Rationale Rationale
=========
Python has had a Unicode string type for some time now but use of 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 it is not yet widespread. There is a large amount of Python code
@ -50,7 +52,7 @@ Rationale
libraries and applications that are not yet Unicode-safe. libraries and applications that are not yet Unicode-safe.
Sometimes it is simple to write code that is both str-stable and Sometimes it is simple to write code that is both str-stable and
Unicode-safe. For example, the following function just works: Unicode-safe. For example, the following function just works::
def appendx(s): def appendx(s):
return s + 'x' return s + 'x'
@ -59,20 +61,21 @@ Rationale
make the task easier. The principle is that when str and unicode make the task easier. The principle is that when str and unicode
instances meet, the result is a unicode instance. One notable instances meet, the result is a unicode instance. One notable
difficulty arises when code requires a string representation of an difficulty arises when code requires a string representation of an
object; an operation traditionally accomplished by using the str() object; an operation traditionally accomplished by using the ``str()``
built-in function. built-in function.
Using the current str() function makes the code not Unicode-safe. Using the current ``str()`` function makes the code not Unicode-safe.
Replacing a str() call with a unicode() call makes the code not Replacing a ``str()`` call with a ``unicode()`` call makes the code not
str-stable. Changing str() so that it could return unicode str-stable. Changing ``str()`` so that it could return unicode
instances would solve this problem. As a further benefit, some code instances would solve this problem. As a further benefit, some code
that is currently not Unicode-safe because it uses str() would that is currently not Unicode-safe because it uses ``str()`` would
become Unicode-safe. become Unicode-safe.
Specification Specification
=============
A Python implementation of the str() built-in follows: A Python implementation of the ``str()`` built-in follows::
def str(s): def str(s):
"""Return a nice string representation of the object. The """Return a nice string representation of the object. The
@ -86,56 +89,61 @@ Specification
return r return r
The following function would be added to the C API and would be the The following function would be added to the C API and would be the
equivalent to the str() built-in (ideally it be called PyObject_Str, equivalent to the ``str()`` built-in (ideally it be called ``PyObject_Str``,
but changing that function could cause a massive number of but changing that function could cause a massive number of
compatibility problems): compatibility problems)::
PyObject *PyString_New(PyObject *); PyObject *PyString_New(PyObject *);
A reference implementation is available on Sourceforge [1] as a A reference implementation is available on Sourceforge [1]_ as a
patch. patch.
Backwards Compatibility Backwards Compatibility
=======================
Some code may require that str() returns a str instance. In the Some code may require that ``str()`` returns a str instance. In the
standard library, only one such case has been found so far. The standard library, only one such case has been found so far. The
function email.header_decode() requires a str instance and the function ``email.header_decode()`` requires a str instance and the
email.Header.decode_header() function tries to ensure this by ``email.Header.decode_header()`` function tries to ensure this by
calling str() on its argument. The code was fixed by changing calling ``str()`` on its argument. The code was fixed by changing
the line "header = str(header)" to: the line "header = str(header)" to::
if isinstance(header, unicode): if isinstance(header, unicode):
header = header.encode('ascii') header = header.encode('ascii')
Whether this is truly a bug is questionable since decode_header() Whether this is truly a bug is questionable since ``decode_header()``
really operates on byte strings, not character strings. Code that really operates on byte strings, not character strings. Code that
passes it a unicode instance could itself be considered buggy. passes it a unicode instance could itself be considered buggy.
Alternative Solutions Alternative Solutions
=====================
A new built-in function could be added instead of changing str(). A new built-in function could be added instead of changing ``str()``.
Doing so would introduce virtually no backwards compatibility Doing so would introduce virtually no backwards compatibility
problems. However, since the compatibility problems are expected to problems. However, since the compatibility problems are expected to
rare, changing str() seems preferable to adding a new built-in. rare, changing ``str()`` seems preferable to adding a new built-in.
The basestring type could be changed to have the proposed behaviour, The basestring type could be changed to have the proposed behaviour,
rather than changing str(). However, that would be confusing rather than changing ``str()``. However, that would be confusing
behaviour for an abstract base type. behaviour for an abstract base type.
References References
==========
[1] http://www.python.org/sf/1266570 .. [1] http://www.python.org/sf/1266570
Copyright Copyright
=========
This document has been placed in the public domain. This document has been placed in the public domain.
..
Local Variables: Local Variables:
mode: indented-text mode: indented-text
indent-tabs-mode: nil indent-tabs-mode: nil