summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/c-api/init.rst4
-rw-r--r--Doc/c-api/unicode.rst29
-rw-r--r--Doc/documenting/markup.rst6
-rw-r--r--Doc/library/codecs.rst2
-rw-r--r--Doc/library/datetime.rst4
-rw-r--r--Doc/library/functions.rst18
-rw-r--r--Doc/library/hashlib.rst4
-rw-r--r--Doc/library/inspect.rst5
-rw-r--r--Doc/library/logging.rst55
-rw-r--r--Doc/library/shelve.rst45
-rw-r--r--Doc/library/stdtypes.rst2
-rw-r--r--Doc/library/sys.rst13
-rw-r--r--Doc/library/termios.rst2
-rw-r--r--Doc/library/threading.rst4
-rw-r--r--Doc/tutorial/interpreter.rst2
-rw-r--r--Doc/tutorial/modules.rst22
-rw-r--r--Doc/whatsnew/2.7.rst7
-rw-r--r--Lib/csv.py22
-rw-r--r--Lib/getpass.py2
-rw-r--r--Lib/inspect.py14
-rw-r--r--Lib/logging/__init__.py30
-rw-r--r--Lib/multiprocessing/managers.py2
-rwxr-xr-xLib/platform.py2
-rw-r--r--Lib/test/test___all__.py1
-rw-r--r--Lib/test/test_csv.py9
-rw-r--r--Lib/test/test_socket.py2
-rw-r--r--Lib/textwrap.py6
-rw-r--r--Misc/developers.txt10
-rw-r--r--Modules/socketmodule.c13
29 files changed, 229 insertions, 108 deletions
diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
index b2baab5..d79c123 100644
--- a/Doc/c-api/init.rst
+++ b/Doc/c-api/init.rst
@@ -371,6 +371,10 @@ Initialization, Finalization, and Threads
Set the default "home" directory, that is, the location of the standard
Python libraries. The libraries are searched in
:file:`{home}/lib/python{version}` and :file:`{home}/lib/python{version}`.
+ The argument should point to a zero-terminated character string in static
+ storage whose contents will not change for the duration of the program's
+ execution. No code in the Python interpreter will change the contents of
+ this storage.
.. cfunction:: w_char* Py_GetPythonHome()
diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst
index dc48158..4c0d6a4 100644
--- a/Doc/c-api/unicode.rst
+++ b/Doc/c-api/unicode.rst
@@ -476,10 +476,13 @@ These are the UTF-32 codec APIs:
*byteorder == 0: native order
*byteorder == 1: big endian
- and then switches if the first four bytes of the input data are a byte order mark
- (BOM) and the specified byte order is native order. This BOM is not copied into
- the resulting Unicode string. After completion, *\*byteorder* is set to the
- current byte order at the end of input data.
+ If ``*byteorder`` is zero, and the first four bytes of the input data are a
+ byte order mark (BOM), the decoder switches to this byte order and the BOM is
+ not copied into the resulting Unicode string. If ``*byteorder`` is ``-1`` or
+ ``1``, any byte order mark is copied to the output.
+
+ After completion, *\*byteorder* is set to the current byte order at the end
+ of input data.
In a narrow build codepoints outside the BMP will be decoded as surrogate pairs.
@@ -500,8 +503,7 @@ These are the UTF-32 codec APIs:
.. cfunction:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder)
Return a Python bytes object holding the UTF-32 encoded value of the Unicode
- data in *s*. If *byteorder* is not ``0``, output is written according to the
- following byte order::
+ data in *s*. Output is written according to the following byte order::
byteorder == -1: little endian
byteorder == 0: native byte order (writes a BOM mark)
@@ -541,10 +543,14 @@ These are the UTF-16 codec APIs:
*byteorder == 0: native order
*byteorder == 1: big endian
- and then switches if the first two bytes of the input data are a byte order mark
- (BOM) and the specified byte order is native order. This BOM is not copied into
- the resulting Unicode string. After completion, *\*byteorder* is set to the
- current byte order at the end of input data.
+ If ``*byteorder`` is zero, and the first two bytes of the input data are a
+ byte order mark (BOM), the decoder switches to this byte order and the BOM is
+ not copied into the resulting Unicode string. If ``*byteorder`` is ``-1`` or
+ ``1``, any byte order mark is copied to the output (where it will result in
+ either a ``\ufeff`` or a ``\ufffe`` character).
+
+ After completion, *\*byteorder* is set to the current byte order at the end
+ of input data.
If *byteorder* is *NULL*, the codec starts in native order mode.
@@ -563,8 +569,7 @@ These are the UTF-16 codec APIs:
.. cfunction:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder)
Return a Python bytes object holding the UTF-16 encoded value of the Unicode
- data in *s*. If *byteorder* is not ``0``, output is written according to the
- following byte order::
+ data in *s*. Output is written according to the following byte order::
byteorder == -1: little endian
byteorder == 0: native byte order (writes a BOM mark)
diff --git a/Doc/documenting/markup.rst b/Doc/documenting/markup.rst
index 3577c96..421971a 100644
--- a/Doc/documenting/markup.rst
+++ b/Doc/documenting/markup.rst
@@ -597,8 +597,10 @@ units as well as normal text:
An important bit of information about an API that a user should be aware of
when using whatever bit of API the warning pertains to. The content of the
directive should be written in complete sentences and include all appropriate
- punctuation. This should only be chosen over ``note`` for information
- regarding the possibility of crashes, data loss, or security implications.
+ punctuation. In the interest of not scaring users away from pages filled
+ with warnings, this directive should only be chosen over ``note`` for
+ information regarding the possibility of crashes, data loss, or security
+ implications.
.. describe:: versionadded
diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst
index 6e02063..c3e7407 100644
--- a/Doc/library/codecs.rst
+++ b/Doc/library/codecs.rst
@@ -986,7 +986,7 @@ particular, the following variants typically exist:
+-----------------+--------------------------------+--------------------------------+
| cp1255 | windows-1255 | Hebrew |
+-----------------+--------------------------------+--------------------------------+
-| cp1256 | windows1256 | Arabic |
+| cp1256 | windows-1256 | Arabic |
+-----------------+--------------------------------+--------------------------------+
| cp1257 | windows-1257 | Baltic languages |
+-----------------+--------------------------------+--------------------------------+
diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst
index df04cf3..c1d3113 100644
--- a/Doc/library/datetime.rst
+++ b/Doc/library/datetime.rst
@@ -63,6 +63,7 @@ Available Types
.. class:: date
+ :noindex:
An idealized naive date, assuming the current Gregorian calendar always was, and
always will be, in effect. Attributes: :attr:`year`, :attr:`month`, and
@@ -70,6 +71,7 @@ Available Types
.. class:: time
+ :noindex:
An idealized time, independent of any particular day, assuming that every day
has exactly 24\*60\*60 seconds (there is no notion of "leap seconds" here).
@@ -78,6 +80,7 @@ Available Types
.. class:: datetime
+ :noindex:
A combination of a date and a time. Attributes: :attr:`year`, :attr:`month`,
:attr:`day`, :attr:`hour`, :attr:`minute`, :attr:`second`, :attr:`microsecond`,
@@ -85,6 +88,7 @@ Available Types
.. class:: timedelta
+ :noindex:
A duration expressing the difference between two :class:`date`, :class:`time`,
or :class:`datetime` instances to microsecond resolution.
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index 9cd2175..465339a 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -600,16 +600,12 @@ are always available. They are listed here in alphabetical order.
.. function:: locals()
Update and return a dictionary representing the current local symbol table.
+ Free variables are returned by :func:`locals` when it is called in function
+ blocks, but not in class blocks.
.. note::
-
The contents of this dictionary should not be modified; changes may not
- affect the values of local variables used by the interpreter.
-
- Free variables are returned by :func:`locals` when it is called in a function
- block. Modifications of free variables may not affect the values used by the
- interpreter. Free variables are not returned in class blocks.
-
+ affect the values of local and free variables used by the interpreter.
.. function:: map(function, iterable, ...)
@@ -1172,10 +1168,10 @@ are always available. They are listed here in alphabetical order.
.. function:: vars([object])
- Without arguments, return a dictionary corresponding to the current local symbol
- table. With a module, class or class instance object as argument (or anything
- else that has a :attr:`__dict__` attribute), returns a dictionary corresponding
- to the object's symbol table.
+ Without an argument, act like :func:`locals`.
+
+ With a module, class or class instance object as argument (or anything else that
+ has a :attr:`__dict__` attribute), return that attribute.
.. note::
The returned dictionary should not be modified:
diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst
index f63d957..a776df1 100644
--- a/Doc/library/hashlib.rst
+++ b/Doc/library/hashlib.rst
@@ -86,11 +86,11 @@ The following values are provided as constant attributes of the hash objects
returned by the constructors:
-.. data:: digest_size
+.. data:: hash.digest_size
The size of the resulting hash in bytes.
-.. data:: block_size
+.. data:: hash.block_size
The internal block size of the hash algorithm in bytes.
diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
index 03bdf3e..ad88e3d 100644
--- a/Doc/library/inspect.rst
+++ b/Doc/library/inspect.rst
@@ -508,6 +508,11 @@ line.
Return the frame object for the caller's stack frame.
+ This function relies on Python stack frame support in the interpreter, which
+ isn't guaranteed to exist in all implementations of Python. If running in
+ an implementation without Python stack frame support this function returns
+ ``None``.
+
.. function:: stack(context=1)
diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
index bb736af..6ff9b8b 100644
--- a/Doc/library/logging.rst
+++ b/Doc/library/logging.rst
@@ -57,7 +57,7 @@ default handler so that debug messages are written to a file::
import logging
LOG_FILENAME = '/tmp/logging_example.out'
- logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)
+ logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
logging.debug('This message should go to the log file')
@@ -1447,6 +1447,55 @@ printed on the console; on the server side, you should see something like::
69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
69 myapp.area2 ERROR The five boxing wizards jump quickly.
+Using arbitrary objects as messages
+-----------------------------------
+
+In the preceding sections and examples, it has been assumed that the message
+passed when logging the event is a string. However, this is not the only
+possibility. You can pass an arbitrary object as a message, and its
+:meth:`__str__` method will be called when the logging system needs to convert
+it to a string representation. In fact, if you want to, you can avoid
+computing a string representation altogether - for example, the
+:class:`SocketHandler` emits an event by pickling it and sending it over the
+wire.
+
+Optimization
+------------
+
+Formatting of message arguments is deferred until it cannot be avoided.
+However, computing the arguments passed to the logging method can also be
+expensive, and you may want to avoid doing it if the logger will just throw
+away your event. To decide what to do, you can call the :meth:`isEnabledFor`
+method which takes a level argument and returns true if the event would be
+created by the Logger for that level of call. You can write code like this::
+
+ if logger.isEnabledFor(logging.DEBUG):
+ logger.debug("Message with %s, %s", expensive_func1(),
+ expensive_func2())
+
+so that if the logger's threshold is set above ``DEBUG``, the calls to
+:func:`expensive_func1` and :func:`expensive_func2` are never made.
+
+There are other optimizations which can be made for specific applications which
+need more precise control over what logging information is collected. Here's a
+list of things you can do to avoid processing during logging which you don't
+need:
+
++-----------------------------------------------+----------------------------------------+
+| What you don't want to collect | How to avoid collecting it |
++===============================================+========================================+
+| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. |
++-----------------------------------------------+----------------------------------------+
+| Threading information. | Set ``logging.logThreads`` to ``0``. |
++-----------------------------------------------+----------------------------------------+
+| Process information. | Set ``logging.logProcesses`` to ``0``. |
++-----------------------------------------------+----------------------------------------+
+
+Also note that the core logging module only includes the basic handlers. If
+you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't
+take up any memory.
+
+.. _handler:
Handler Objects
---------------
@@ -1562,9 +1611,9 @@ file-like object (or, more precisely, any object which supports :meth:`write`
and :meth:`flush` methods).
-.. class:: StreamHandler(strm=None)
+.. class:: StreamHandler(stream=None)
- Returns a new instance of the :class:`StreamHandler` class. If *strm* is
+ Returns a new instance of the :class:`StreamHandler` class. If *stream* is
specified, the instance will use it for logging output; otherwise, *sys.stderr*
will be used.
diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst
index 10242fd..e386290 100644
--- a/Doc/library/shelve.rst
+++ b/Doc/library/shelve.rst
@@ -27,27 +27,39 @@ lots of shared sub-objects. The keys are ordinary strings.
Because of Python semantics, a shelf cannot know when a mutable
persistent-dictionary entry is modified. By default modified objects are
- written only when assigned to the shelf (see :ref:`shelve-example`). If
- the optional *writeback* parameter is set to *True*, all entries accessed
- are cached in memory, and written back at close time; this can make it
- handier to mutate mutable entries in the persistent dictionary, but, if
- many entries are accessed, it can consume vast amounts of memory for the
- cache, and it can make the close operation very slow since all accessed
- entries are written back (there is no way to determine which accessed
- entries are mutable, nor which ones were actually mutated).
+ written only when assigned to the shelf (see :ref:`shelve-example`). If the
+ optional *writeback* parameter is set to *True*, all entries accessed are
+ cached in memory, and written back on :meth:`sync` and :meth:`close`; this
+ can make it handier to mutate mutable entries in the persistent dictionary,
+ but, if many entries are accessed, it can consume vast amounts of memory for
+ the cache, and it can make the close operation very slow since all accessed
+ entries are written back (there is no way to determine which accessed entries
+ are mutable, nor which ones were actually mutated).
+
+ .. note::
+
+ Do not rely on the shelf being closed automatically; always call
+ :meth:`close` explicitly when you don't need it any more, or use a
+ :keyword:`with` statement with :func:`contextlib.closing`.
+
Shelf objects support all methods supported by dictionaries. This eases the
transition from dictionary based scripts to those requiring persistent storage.
-One additional method is supported:
-
+Two additional methods are supported:
.. method:: Shelf.sync()
- Write back all entries in the cache if the shelf was opened with *writeback* set
- to *True*. Also empty the cache and synchronize the persistent dictionary on
- disk, if feasible. This is called automatically when the shelf is closed with
- :meth:`close`.
+ Write back all entries in the cache if the shelf was opened with *writeback*
+ set to :const:`True`. Also empty the cache and synchronize the persistent
+ dictionary on disk, if feasible. This is called automatically when the shelf
+ is closed with :meth:`close`.
+
+.. method:: Shelf.close()
+
+ Synchronize and close the persistent *dict* object. Operations on a closed
+ shelf will fail with a :exc:`ValueError`.
+
.. seealso::
@@ -71,11 +83,6 @@ Restrictions
database should be fairly small, and in rare cases key collisions may cause
the database to refuse updates.
-* Depending on the implementation, closing a persistent dictionary may or may
- not be necessary to flush changes to disk. The :meth:`__del__` method of the
- :class:`Shelf` class calls the :meth:`close` method, so the programmer generally
- need not do this explicitly.
-
* The :mod:`shelve` module does not support *concurrent* read/write access to
shelved objects. (Multiple simultaneous read accesses are safe.) When a
program has a shelf open for writing, no other program should have it open for
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index 8f56bb0..3b02f98 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -1148,6 +1148,8 @@ functions based on regular expressions.
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."
+ For 8-bit strings, this method is locale-dependent.
+
.. method:: str.translate(map)
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index e895e4c..b786034 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -337,12 +337,12 @@ always available.
does not have to hold true for third-party extensions as it is implementation
specific.
- The *default* argument allows to define a value which will be returned
- if the object type does not provide means to retrieve the size and would
- cause a `TypeError`.
+ If given, *default* will be returned if the object does not provide means to
+ retrieve the size. Otherwise a `TypeError` will be raised.
- :func:`getsizeof` calls the object's __sizeof__ method and adds an additional
- garbage collector overhead if the object is managed by the garbage collector.
+ :func:`getsizeof` calls the object's ``__sizeof__`` method and adds an
+ additional garbage collector overhead if the object is managed by the garbage
+ collector.
.. function:: _getframe([depth])
@@ -352,7 +352,8 @@ always available.
that is deeper than the call stack, :exc:`ValueError` is raised. The default
for *depth* is zero, returning the frame at the top of the call stack.
- This function should be used for internal and specialized purposes only.
+ This function should be used for internal and specialized purposes only. It
+ is not guaranteed to exist in all implementations of Python.
.. function:: getprofile()
diff --git a/Doc/library/termios.rst b/Doc/library/termios.rst
index df29496..591850e 100644
--- a/Doc/library/termios.rst
+++ b/Doc/library/termios.rst
@@ -89,7 +89,7 @@ technique using a separate :func:`tcgetattr` call and a :keyword:`try` ...
:keyword:`finally` statement to ensure that the old tty attributes are restored
exactly no matter what happens::
- def getpass(prompt = "Password: "):
+ def getpass(prompt="Password: "):
import termios, sys
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst
index aa7f46a..f642111 100644
--- a/Doc/library/threading.rst
+++ b/Doc/library/threading.rst
@@ -23,7 +23,7 @@ This module defines the following functions and objects:
.. function:: active_count()
Return the number of :class:`Thread` objects currently alive. The returned
- count is equal to the length of the list returned by :func:`enumerate`.
+ count is equal to the length of the list returned by :func:`.enumerate`.
.. function:: Condition()
@@ -301,7 +301,7 @@ impossible to detect the termination of alien threads.
Roughly, a thread is alive from the moment the :meth:`start` method
returns until its :meth:`run` method terminates. The module function
- :func:`enumerate` returns a list of all alive threads.
+ :func:`.enumerate` returns a list of all alive threads.
.. attribute:: daemon
diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst
index 6c6bc16..bca02ed 100644
--- a/Doc/tutorial/interpreter.rst
+++ b/Doc/tutorial/interpreter.rst
@@ -31,7 +31,7 @@ command into the command prompt in a DOS box::
Typing an end-of-file character (:kbd:`Control-D` on Unix, :kbd:`Control-Z` on
Windows) at the primary prompt causes the interpreter to exit with a zero exit
status. If that doesn't work, you can exit the interpreter by typing the
-following commands: ``import sys; sys.exit()``.
+following command: ``quit()``.
The interpreter's line-editing features usually aren't very sophisticated. On
Unix, whoever installed the interpreter may have enabled support for the GNU
diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst
index 1023ba8..d4bfbda 100644
--- a/Doc/tutorial/modules.rst
+++ b/Doc/tutorial/modules.rst
@@ -107,6 +107,10 @@ In most cases Python programmers do not use this facility since it introduces
an unknown set of names into the interpreter, possibly hiding some things
you have already defined.
+Note that in general the practice of importing ``*`` from a module or package is
+frowned upon, since it often causes poorly readable code. However, it is okay to
+use it to save typing in interactive sessions.
+
.. note::
For efficiency reasons, each module is only imported once per interpreter
@@ -445,14 +449,9 @@ Importing \* From a Package
Now what happens when the user writes ``from sound.effects import *``? Ideally,
one would hope that this somehow goes out to the filesystem, finds which
-submodules are present in the package, and imports them all. Unfortunately,
-this operation does not work very well on Windows platforms, where the
-filesystem does not always have accurate information about the case of a
-filename. On these platforms, there is no guaranteed way to know whether a file
-:file:`ECHO.PY` should be imported as a module :mod:`echo`, :mod:`Echo` or
-:mod:`ECHO`. (For example, Windows 95 has the annoying practice of showing all
-file names with a capitalized first letter.) The DOS 8+3 filename restriction
-adds another interesting problem for long module names.
+submodules are present in the package, and imports them all. This could take a
+long time and importing sub-modules might have unwanted side-effects that should
+only happen when the sub-module is explicitly imported.
The only solution is for the package author to provide an explicit index of the
package. The :keyword:`import` statement uses the following convention: if a package's
@@ -487,10 +486,9 @@ current namespace because they are defined in the :mod:`sound.effects` package
when the ``from...import`` statement is executed. (This also works when
``__all__`` is defined.)
-Note that in general the practice of importing ``*`` from a module or package is
-frowned upon, since it often causes poorly readable code. However, it is okay to
-use it to save typing in interactive sessions, and certain modules are designed
-to export only names that follow certain patterns.
+Although certain modules are designed to export only names that follow certain
+patterns when you use ``import *``, it is still considered bad practise in
+production code.
Remember, there is nothing wrong with using ``from Package import
specific_submodule``! In fact, this is the recommended notation unless the
diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst
index f5f7d19..e92af99 100644
--- a/Doc/whatsnew/2.7.rst
+++ b/Doc/whatsnew/2.7.rst
@@ -505,6 +505,13 @@ changes, or look through the Subversion logs for all the details.
differences. :meth:`assertDictContainsSubset` checks whether
all of the key/value pairs in *first* are found in *second*.
+ * :meth:`assertAlmostEqual` and :meth:`assertNotAlmostEqual` short-circuit
+ (automatically pass or fail without checking decimal places) if the objects
+ are equal.
+
+ * :meth:`loadTestsFromName` properly honors the ``suiteClass`` attribute of
+ the :class:`TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.)
+
* A new hook, :meth:`addTypeEqualityFunc` takes a type object and a
function. The :meth:`assertEqual` method will use the function
when both of the objects being compared are of the specified type.
diff --git a/Lib/csv.py b/Lib/csv.py
index ee62abe..59ec372 100644
--- a/Lib/csv.py
+++ b/Lib/csv.py
@@ -165,7 +165,7 @@ class Sniffer:
Returns a dialect (or None) corresponding to the sample
"""
- quotechar, delimiter, skipinitialspace = \
+ quotechar, doublequote, delimiter, skipinitialspace = \
self._guess_quote_and_delimiter(sample, delimiters)
if not delimiter:
delimiter, skipinitialspace = self._guess_delimiter(sample,
@@ -179,8 +179,8 @@ class Sniffer:
lineterminator = '\r\n'
quoting = QUOTE_MINIMAL
# escapechar = ''
- doublequote = False
+ dialect.doublequote = doublequote
dialect.delimiter = delimiter
# _csv.reader won't accept a quotechar of ''
dialect.quotechar = quotechar or '"'
@@ -212,8 +212,8 @@ class Sniffer:
break
if not matches:
- return ('', None, 0) # (quotechar, delimiter, skipinitialspace)
-
+ # (quotechar, doublequote, delimiter, skipinitialspace)
+ return ('', False, None, 0)
quotes = {}
delims = {}
spaces = 0
@@ -248,7 +248,19 @@ class Sniffer:
delim = ''
skipinitialspace = 0
- return (quotechar, delim, skipinitialspace)
+ # if we see an extra quote between delimiters, we've got a
+ # double quoted format
+ dq_regexp = re.compile(r"((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$)" % \
+ {'delim':delim, 'quote':quotechar}, re.MULTILINE)
+
+
+
+ if dq_regexp.search(data):
+ doublequote = True
+ else:
+ doublequote = False
+
+ return (quotechar, doublequote, delim, skipinitialspace)
def _guess_delimiter(self, data, delimiters):
diff --git a/Lib/getpass.py b/Lib/getpass.py
index 857188f..d0030ae 100644
--- a/Lib/getpass.py
+++ b/Lib/getpass.py
@@ -51,7 +51,7 @@ def unix_getpass(prompt='Password: ', stream=None):
# If that fails, see if stdin can be controlled.
try:
fd = sys.stdin.fileno()
- except:
+ except (AttributeError, ValueError):
passwd = fallback_getpass(prompt, stream)
input = sys.stdin
if not stream:
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 79565c1..1f1b7f9 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -398,12 +398,12 @@ def getfile(object):
if ismodule(object):
if hasattr(object, '__file__'):
return object.__file__
- raise TypeError('arg is a built-in module')
+ raise TypeError('{!r} is a built-in module'.format(object))
if isclass(object):
object = sys.modules.get(object.__module__)
if hasattr(object, '__file__'):
return object.__file__
- raise TypeError('arg is a built-in class')
+ raise TypeError('{!r} is a built-in class'.format(object))
if ismethod(object):
object = object.__func__
if isfunction(object):
@@ -414,8 +414,8 @@ def getfile(object):
object = object.f_code
if iscode(object):
return object.co_filename
- raise TypeError('arg is not a module, class, method, '
- 'function, traceback, frame, or code object')
+ raise TypeError('{!r} is not a module, class, method, '
+ 'function, traceback, frame, or code object'.format(object))
ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
@@ -747,7 +747,7 @@ def _getfullargs(co):
names of the * and ** arguments or None."""
if not iscode(co):
- raise TypeError('arg is not a code object')
+ raise TypeError('{!r} is not a code object'.format(co))
nargs = co.co_argcount
names = co.co_varnames
@@ -811,7 +811,7 @@ def getfullargspec(func):
if ismethod(func):
func = func.__func__
if not isfunction(func):
- raise TypeError('arg is not a Python function')
+ raise TypeError('{!r} is not a Python function'.format(func))
args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
return FullArgSpec(args, varargs, varkw, func.__defaults__,
kwonlyargs, func.__kwdefaults__, func.__annotations__)
@@ -944,7 +944,7 @@ def getframeinfo(frame, context=1):
else:
lineno = frame.f_lineno
if not isframe(frame):
- raise TypeError('arg is not a frame or traceback object')
+ raise TypeError('{!r} is not a frame or traceback object'.format(frame))
filename = getsourcefile(frame) or getfile(frame)
if context > 0:
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index f932110..fecca2b 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -271,11 +271,14 @@ class LogRecord:
else:
self.thread = None
self.threadName = None
- if logMultiprocessing:
- from multiprocessing import current_process
- self.processName = current_process().name
- else:
+ if not logMultiprocessing:
self.processName = None
+ else:
+ try:
+ from multiprocessing import current_process
+ self.processName = current_process().name
+ except ImportError:
+ self.processName = None
if logProcesses and hasattr(os, 'getpid'):
self.process = os.getpid()
else:
@@ -734,16 +737,16 @@ class StreamHandler(Handler):
sys.stdout or sys.stderr may be used.
"""
- def __init__(self, strm=None):
+ def __init__(self, stream=None):
"""
Initialize the handler.
- If strm is not specified, sys.stderr is used.
+ If stream is not specified, sys.stderr is used.
"""
Handler.__init__(self)
- if strm is None:
- strm = sys.stderr
- self.stream = strm
+ if stream is None:
+ stream = sys.stderr
+ self.stream = stream
def flush(self):
"""
@@ -1113,7 +1116,11 @@ class Logger(Filterer):
Find the stack frame of the caller so that we can note the source
file name, line number and function name.
"""
- f = currentframe().f_back
+ f = currentframe()
+ #On some versions of IronPython, currentframe() returns None if
+ #IronPython isn't run with -X:Frames.
+ if f is not None:
+ f = f.f_back
rv = "(unknown file)", 0, "(unknown function)"
while hasattr(f, "f_code"):
co = f.f_code
@@ -1145,7 +1152,8 @@ class Logger(Filterer):
"""
if _srcfile:
#IronPython doesn't track Python frames, so findCaller throws an
- #exception. We trap it here so that IronPython can use logging.
+ #exception on some versions of IronPython. We trap it here so that
+ #IronPython can use logging.
try:
fn, lno, func = self.findCaller()
except ValueError:
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py
index 40af8f0..8faf34e 100644
--- a/Lib/multiprocessing/managers.py
+++ b/Lib/multiprocessing/managers.py
@@ -413,7 +413,7 @@ class Server(object):
self.id_to_refcount[ident] -= 1
if self.id_to_refcount[ident] == 0:
del self.id_to_obj[ident], self.id_to_refcount[ident]
- util.debug('disposing of obj with id %d', ident)
+ util.debug('disposing of obj with id %r', ident)
finally:
self.mutex.release()
diff --git a/Lib/platform.py b/Lib/platform.py
index 21e098b..13129d5 100755
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -10,7 +10,7 @@
"""
# This module is maintained by Marc-Andre Lemburg <mal@egenix.com>.
# If you find problems, please submit bug reports/patches via the
-# Python SourceForge Project Page and assign them to "lemburg".
+# Python bug tracker (http://bugs.python.org) and assign them to "lemburg".
#
# Still needed:
# * more support for WinCE
diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index 8ebe568..a4e69b2 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -82,6 +82,7 @@ class AllTest(unittest.TestCase):
self.check_all("keyword")
self.check_all("linecache")
self.check_all("locale")
+ self.check_all("logging")
self.check_all("macpath")
self.check_all("macurl2path")
self.check_all("mailbox")
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 95105be..75d1a91 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -767,7 +767,7 @@ Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
'Harry''s':'Arlington Heights':'IL':'2/1/03':'Kimi Hayes'
'Shark City':'Glendale Heights':'IL':'12/28/02':'Prezence'
'Tommy''s Place':'Blue Island':'IL':'12/28/02':'Blue Sunday/White Crow'
-'Stonecutters Seafood and Chop House':'Lemont':'IL':'12/19/02':'Week Back'
+'Stonecutters ''Seafood'' and Chop House':'Lemont':'IL':'12/19/02':'Week Back'
"""
header = '''\
"venue","city","state","date","performers"
@@ -826,6 +826,13 @@ Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
self.assertEqual(dialect.delimiter, "|")
self.assertEqual(dialect.quotechar, "'")
+ def test_doublequote(self):
+ sniffer = csv.Sniffer()
+ dialect = sniffer.sniff(self.header)
+ self.assertFalse(dialect.doublequote)
+ dialect = sniffer.sniff(self.sample2)
+ self.assertTrue(dialect.doublequote)
+
if not hasattr(sys, "gettotalrefcount"):
if support.verbose: print("*** skipping leakage tests ***")
else:
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 8313006..0f0cb80 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -291,7 +291,7 @@ class GeneralModuleTests(unittest.TestCase):
# On some versions, this loses a reference
orig = sys.getrefcount(__name__)
socket.getnameinfo(__name__,0)
- except SystemError:
+ except TypeError:
if sys.getrefcount(__name__) != orig:
self.fail("socket.getnameinfo loses a reference")
diff --git a/Lib/textwrap.py b/Lib/textwrap.py
index 1f2e9b4..f4886a1 100644
--- a/Lib/textwrap.py
+++ b/Lib/textwrap.py
@@ -135,7 +135,7 @@ class TextWrapper:
"""_split(text : string) -> [string]
Split the text to wrap into indivisible chunks. Chunks are
- not quite the same as words; see wrap_chunks() for full
+ not quite the same as words; see _wrap_chunks() for full
details. As an example, the text
Look, goof-ball -- use the -b option!
breaks into the following chunks:
@@ -163,9 +163,9 @@ class TextWrapper:
space to two.
"""
i = 0
- pat = self.sentence_end_re
+ patsearch = self.sentence_end_re.search
while i < len(chunks)-1:
- if chunks[i+1] == " " and pat.search(chunks[i]):
+ if chunks[i+1] == " " and patsearch(chunks[i]):
chunks[i+1] = " "
i += 2
else:
diff --git a/Misc/developers.txt b/Misc/developers.txt
index d9c7870..25d5324 100644
--- a/Misc/developers.txt
+++ b/Misc/developers.txt
@@ -20,6 +20,9 @@ for details. When the agreement is signed, please note it in this log.
Permissions History
-------------------
+- Doug Hellmann was given SVN access on September 19 2009 by GFB, at
+ suggestion of Jesse Noller, for documentation work.
+
- Ezio Melotti was given SVN access on June 7 2009 by GFB, for work on and
fixes to the documentation.
@@ -109,6 +112,13 @@ Permissions History
- Jeffrey Yasskin was given SVN access on 9 August 2007 by NCN,
for his work on PEPs and other general patches.
+- Mark Summerfield was given SVN access on 1 August 2007 by GFB,
+ for work on documentation.
+
+- Armin Ronacher was given SVN access on 23 July 2007 by GFB,
+ for work on the documentation toolset. He now maintains the
+ ast module.
+
- Senthil Kumaran was given SVN access on 16 June 2007 by MvL,
for his Summer-of-Code project, mentored by Skip Montanaro.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index de720e1..458c88c 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -3890,8 +3890,13 @@ socket_getnameinfo(PyObject *self, PyObject *args)
flags = flowinfo = scope_id = 0;
if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
return NULL;
- if (!PyArg_ParseTuple(sa, "si|ii",
- &hostp, &port, &flowinfo, &scope_id))
+ if (!PyTuple_Check(sa)) {
+ PyErr_SetString(PyExc_TypeError,
+ "getnameinfo() argument 1 must be a tuple");
+ return NULL;
+ }
+ if (!PyArg_ParseTuple(sa, "si|ii",
+ &hostp, &port, &flowinfo, &scope_id))
return NULL;
PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
memset(&hints, 0, sizeof(hints));
@@ -3914,9 +3919,7 @@ socket_getnameinfo(PyObject *self, PyObject *args)
switch (res->ai_family) {
case AF_INET:
{
- char *t1;
- int t2;
- if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
+ if (PyTuple_GET_SIZE(sa) != 2) {
PyErr_SetString(socket_error,
"IPv4 sockaddr must be 2 tuple");
goto fail;