Merged revisions 66045,66048-66049,66053,66060,66062-66063,66065,66067,66071-66074,66080,66082-66083,66090-66093,66097-66099,66103,66105,66110,66118 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r66045 | andrew.kuchling | 2008-08-26 19:27:18 -0500 (Tue, 26 Aug 2008) | 1 line Trim whitespace; add a few updates ........ r66048 | andrew.kuchling | 2008-08-26 19:45:02 -0500 (Tue, 26 Aug 2008) | 1 line Add an item and a note ........ r66049 | andrew.kuchling | 2008-08-26 21:12:18 -0500 (Tue, 26 Aug 2008) | 1 line Add various items ........ r66053 | georg.brandl | 2008-08-28 04:40:18 -0500 (Thu, 28 Aug 2008) | 2 lines #3711: .dll isn't a valid Python extension anymore. ........ r66060 | armin.rigo | 2008-08-29 16:21:52 -0500 (Fri, 29 Aug 2008) | 3 lines A collection of crashers, all variants of the idea of issue #3720. ........ r66062 | georg.brandl | 2008-08-30 04:49:36 -0500 (Sat, 30 Aug 2008) | 2 lines #3730: mention "server" attribute explicitly. ........ r66063 | georg.brandl | 2008-08-30 04:52:44 -0500 (Sat, 30 Aug 2008) | 2 lines #3716: fix typo. ........ r66065 | georg.brandl | 2008-08-30 05:03:09 -0500 (Sat, 30 Aug 2008) | 2 lines #3569: eval() also accepts "exec"able code objects. ........ r66067 | georg.brandl | 2008-08-30 08:17:39 -0500 (Sat, 30 Aug 2008) | 2 lines super() actually returns a super object. ........ r66071 | andrew.kuchling | 2008-08-30 10:19:57 -0500 (Sat, 30 Aug 2008) | 1 line Partial edits from revision and tidying pass ........ r66072 | andrew.kuchling | 2008-08-30 10:21:23 -0500 (Sat, 30 Aug 2008) | 1 line Tidy up some sentences ........ r66073 | andrew.kuchling | 2008-08-30 10:25:47 -0500 (Sat, 30 Aug 2008) | 1 line Correction from Antoine Pitrou: BufferedWriter and Reader support seek() ........ r66074 | andrew.kuchling | 2008-08-30 11:44:54 -0500 (Sat, 30 Aug 2008) | 1 line Edit four more sections ........ r66080 | georg.brandl | 2008-08-30 17:00:28 -0500 (Sat, 30 Aug 2008) | 2 lines Fix markup. ........ r66082 | andrew.kuchling | 2008-08-30 17:56:54 -0500 (Sat, 30 Aug 2008) | 1 line More edits; markup fixes ........ r66083 | andrew.kuchling | 2008-08-30 21:24:08 -0500 (Sat, 30 Aug 2008) | 1 line More edits ........ r66090 | andrew.kuchling | 2008-08-31 09:29:31 -0500 (Sun, 31 Aug 2008) | 1 line Edit the library section, rearranging items to flow better and making lots of edits ........ r66091 | andrew.kuchling | 2008-08-31 10:41:48 -0500 (Sun, 31 Aug 2008) | 1 line Last batch of edits; remove the 'other changes' section ........ r66092 | andrew.kuchling | 2008-08-31 10:48:44 -0500 (Sun, 31 Aug 2008) | 1 line Update patch/bug count ........ r66093 | gregory.p.smith | 2008-08-31 11:34:18 -0500 (Sun, 31 Aug 2008) | 3 lines issue3715: docstring representation of hex escaped string needs to be double escaped. ........ r66097 | benjamin.peterson | 2008-09-01 09:13:43 -0500 (Mon, 01 Sep 2008) | 4 lines #3703 unhelpful _fileio.FileIO error message when trying to open a directory Reviewer: Gregory P. Smith ........ r66098 | georg.brandl | 2008-09-01 09:15:55 -0500 (Mon, 01 Sep 2008) | 2 lines #3749: fix c'n'p errors. ........ r66099 | benjamin.peterson | 2008-09-01 09:18:30 -0500 (Mon, 01 Sep 2008) | 4 lines Fix compilation when --without-threads is given #3683 Reviewer: Georg Brandl, Benjamin Peterson ........ r66103 | vinay.sajip | 2008-09-01 09:30:10 -0500 (Mon, 01 Sep 2008) | 1 line logging: fixed lack of use of encoding attribute specified on a stream. ........ r66105 | vinay.sajip | 2008-09-01 09:33:59 -0500 (Mon, 01 Sep 2008) | 1 line logging: fixed lack of use of encoding attribute specified on a stream. ........ r66110 | vinay.sajip | 2008-09-01 10:08:07 -0500 (Mon, 01 Sep 2008) | 1 line Added section about configuring logging in a library. Thanks to Thomas Heller for the idea. ........ r66118 | vinay.sajip | 2008-09-01 12:44:14 -0500 (Mon, 01 Sep 2008) | 1 line Bug #3738: Documentation is now more accurate in describing handler close methods. ........
This commit is contained in:
parent
d098ff2324
commit
3e4f055602
|
@ -102,10 +102,14 @@ described here are distributed with the Python sources in the
|
|||
and it should call :cfunc:`Py_InitModule` with the string ``"spam"`` as its
|
||||
first argument (use the minimal :file:`example.c` in this directory as a guide).
|
||||
By convention, it lives in a file called :file:`spam.c` or :file:`spammodule.c`.
|
||||
The output file should be called :file:`spam.dll` or :file:`spam.pyd` (the
|
||||
latter is supported to avoid confusion with a system library :file:`spam.dll` to
|
||||
which your module could be a Python interface) in Release mode, or
|
||||
:file:`spam_d.dll` or :file:`spam_d.pyd` in Debug mode.
|
||||
The output file should be called :file:`spam.pyd` (in Release mode) or
|
||||
:file:`spam_d.pyd` (in Debug mode). The extension :file:`.pyd` was chosen
|
||||
to avoid confusion with a system library :file:`spam.dll` to which your module
|
||||
could be a Python interface.
|
||||
|
||||
.. versionchanged:: 2.5
|
||||
Previously, file names like :file:`spam.dll` (in release mode) or
|
||||
:file:`spam_d.dll` (in debug mode) were also recognized.
|
||||
|
||||
Now your options are:
|
||||
|
||||
|
|
|
@ -51,13 +51,13 @@ It defines the following functions:
|
|||
Codec Interface). The functions/methods are expected to work in a stateless
|
||||
mode.
|
||||
|
||||
*incrementalencoder* and *incrementalencoder*: These have to be factory
|
||||
*incrementalencoder* and *incrementaldecoder*: These have to be factory
|
||||
functions providing the following interface:
|
||||
|
||||
``factory(errors='strict')``
|
||||
|
||||
The factory functions must return objects providing the interfaces defined by
|
||||
the base classes :class:`IncrementalEncoder` and :class:`IncrementalEncoder`,
|
||||
the base classes :class:`IncrementalEncoder` and :class:`IncrementalDecoder`,
|
||||
respectively. Incremental codecs can maintain state.
|
||||
|
||||
*streamreader* and *streamwriter*: These have to be factory functions providing
|
||||
|
@ -478,7 +478,7 @@ define in order to be compatible with the Python codec registry.
|
|||
|
||||
The *errors* argument will be assigned to an attribute of the same name.
|
||||
Assigning to this attribute makes it possible to switch between different error
|
||||
handling strategies during the lifetime of the :class:`IncrementalEncoder`
|
||||
handling strategies during the lifetime of the :class:`IncrementalDecoder`
|
||||
object.
|
||||
|
||||
The set of allowed values for the *errors* argument can be extended with
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
|
||||
``ctypes`` is a foreign function library for Python. It provides C compatible
|
||||
data types, and allows calling functions in dlls/shared libraries. It can be
|
||||
data types, and allows calling functions in DLLs or shared libraries. It can be
|
||||
used to wrap these libraries in pure Python.
|
||||
|
||||
|
||||
|
@ -21,8 +21,8 @@ Note: The code samples in this tutorial use ``doctest`` to make sure that they
|
|||
actually work. Since some code samples behave differently under Linux, Windows,
|
||||
or Mac OS X, they contain doctest directives in comments.
|
||||
|
||||
Note: Some code sample references the ctypes :class:`c_int` type. This type is
|
||||
an alias to the :class:`c_long` type on 32-bit systems. So, you should not be
|
||||
Note: Some code samples reference the ctypes :class:`c_int` type. This type is
|
||||
an alias for the :class:`c_long` type on 32-bit systems. So, you should not be
|
||||
confused if :class:`c_long` is printed if you would expect :class:`c_int` ---
|
||||
they are actually the same type.
|
||||
|
||||
|
@ -32,8 +32,8 @@ they are actually the same type.
|
|||
Loading dynamic link libraries
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``ctypes`` exports the *cdll*, and on Windows also *windll* and *oledll* objects
|
||||
to load dynamic link libraries.
|
||||
``ctypes`` exports the *cdll*, and on Windows *windll* and *oledll*
|
||||
objects, for loading dynamic link libraries.
|
||||
|
||||
You load libraries by accessing them as attributes of these objects. *cdll*
|
||||
loads libraries which export functions using the standard ``cdecl`` calling
|
||||
|
@ -2018,7 +2018,7 @@ Data types
|
|||
|
||||
.. method:: _CData.from_buffer_copy(source[, offset])
|
||||
|
||||
This method creates a ctypes instance, the buffer is copied from
|
||||
This method creates a ctypes instance, copying the buffer from
|
||||
the source object buffer which must be readable. The optional
|
||||
``offset`` parameter specifies an offset into the source buffer
|
||||
in bytes; the default is zero. If the source buffer is not
|
||||
|
@ -2033,13 +2033,13 @@ Data types
|
|||
|
||||
.. method:: from_param(obj)
|
||||
|
||||
This method adapts obj to a ctypes type. It is called with the actual
|
||||
object used in a foreign function call, when the type is present in the
|
||||
foreign functions :attr:`argtypes` tuple; it must return an object that
|
||||
can be used as function call parameter.
|
||||
This method adapts *obj* to a ctypes type. It is called with the actual
|
||||
object used in a foreign function call when the type is present in the
|
||||
foreign function's :attr:`argtypes` tuple; it must return an object that
|
||||
can be used as a function call parameter.
|
||||
|
||||
All ctypes data types have a default implementation of this classmethod,
|
||||
normally it returns ``obj`` if that is an instance of the type. Some
|
||||
All ctypes data types have a default implementation of this classmethod
|
||||
that normally returns ``obj`` if that is an instance of the type. Some
|
||||
types accept other objects as well.
|
||||
|
||||
|
||||
|
|
|
@ -372,10 +372,10 @@ are always available. They are listed here in alphabetical order.
|
|||
>>> eval('x+1')
|
||||
2
|
||||
|
||||
This function can also be used to execute arbitrary code objects (such as those
|
||||
created by :func:`compile`). In this case pass a code object instead of a
|
||||
string. The code object must have been compiled passing ``'eval'`` as the
|
||||
*kind* argument.
|
||||
This function can also be used to execute arbitrary code objects (such as
|
||||
those created by :func:`compile`). In this case pass a code object instead
|
||||
of a string. If the code object has been compiled with ``'exec'`` as the
|
||||
*kind* argument, :func:`eval`\'s return value will be ``None``.
|
||||
|
||||
Hints: dynamic execution of statements is supported by the :func:`exec`
|
||||
function. The :func:`globals` and :func:`locals` functions
|
||||
|
@ -1086,14 +1086,14 @@ are always available. They are listed here in alphabetical order.
|
|||
|
||||
.. XXX updated as per http://www.artima.com/weblogs/viewpost.jsp?thread=208549 but needs checking
|
||||
|
||||
Return the superclass of *type*.
|
||||
|
||||
Calling :func:`super()` without arguments is equivalent to
|
||||
``super(this_class, first_arg)``. If called with one
|
||||
argument the super object returned is unbound. If called with two
|
||||
arguments and the second argument is an object, ``isinstance(obj,
|
||||
type)`` must be true. If the second argument is a type,
|
||||
``issubclass(type2, type)`` must be true.
|
||||
Return a "super" object that acts like the superclass of *type*. If the
|
||||
second argument is omitted the super object returned is unbound. If the
|
||||
second argument is an object, ``isinstance(obj, type)`` must be true. If the
|
||||
second argument is a type, ``issubclass(type2, type)`` must be
|
||||
true. :func:`super` only works for :term:`new-style class`\es. Calling
|
||||
:func:`super()` without arguments is equivalent to ``super(this_class,
|
||||
first_arg)``.
|
||||
|
||||
A typical use for calling a cooperative superclass method is::
|
||||
|
||||
|
|
|
@ -56,6 +56,11 @@ of which this module provides three different variants:
|
|||
Contains a tuple of the form ``(host, port)`` referring to the client's
|
||||
address.
|
||||
|
||||
.. attribute:: server
|
||||
|
||||
Contains the server instance.
|
||||
|
||||
|
||||
.. attribute:: command
|
||||
|
||||
Contains the command (request type). For example, ``'GET'``.
|
||||
|
|
|
@ -420,6 +420,45 @@ You can see that the config file approach has a few advantages over the Python
|
|||
code approach, mainly separation of configuration and code and the ability of
|
||||
noncoders to easily modify the logging properties.
|
||||
|
||||
Configuring Logging for a Library
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
When developing a library which uses logging, some consideration needs to be
|
||||
given to its configuration. If the using application does not use logging, and
|
||||
library code makes logging calls, then a one-off message "No handlers could be
|
||||
found for logger X.Y.Z" is printed to the console. This message is intended
|
||||
to catch mistakes in logging configuration, but will confuse an application
|
||||
developer who is not aware of logging by the library.
|
||||
|
||||
In addition to documenting how a library uses logging, a good way to configure
|
||||
library logging so that it does not cause a spurious message is to add a
|
||||
handler which does nothing. This avoids the message being printed, since a
|
||||
handler will be found: it just doesn't produce any output. If the library user
|
||||
configures logging for application use, presumably that configuration will add
|
||||
some handlers, and if levels are suitably configured then logging calls made
|
||||
in library code will send output to those handlers, as normal.
|
||||
|
||||
A do-nothing handler can be simply defined as follows::
|
||||
|
||||
import logging
|
||||
|
||||
class NullHandler(logging.Handler):
|
||||
def emit(self, record):
|
||||
pass
|
||||
|
||||
An instance of this handler should be added to the top-level logger of the
|
||||
logging namespace used by the library. If all logging by a library *foo* is
|
||||
done using loggers with names matching "foo.x.y", then the code::
|
||||
|
||||
import logging
|
||||
|
||||
h = NullHandler()
|
||||
logging.getLogger("foo").addHandler(h)
|
||||
|
||||
should have the desired effect. If an organisation produces a number of
|
||||
libraries, then the logger name specified can be "orgname.foo" rather than
|
||||
just "foo".
|
||||
|
||||
|
||||
Logging Levels
|
||||
--------------
|
||||
|
@ -1440,8 +1479,10 @@ subclasses. However, the :meth:`__init__` method in subclasses needs to call
|
|||
|
||||
.. method:: Handler.close()
|
||||
|
||||
Tidy up any resources used by the handler. This version does nothing and is
|
||||
intended to be implemented by subclasses.
|
||||
Tidy up any resources used by the handler. This version does no output but
|
||||
removes the handler from an internal list of handlers which is closed when
|
||||
:func:`shutdown` is called. Subclasses should ensure that this gets called
|
||||
from overridden :meth:`close` methods.
|
||||
|
||||
|
||||
.. method:: Handler.handle(record)
|
||||
|
@ -1503,7 +1544,7 @@ and :meth:`flush` methods).
|
|||
|
||||
Flushes the stream by calling its :meth:`flush` method. Note that the
|
||||
:meth:`close` method is inherited from :class:`Handler` and so does
|
||||
nothing, so an explicit :meth:`flush` call may be needed at times.
|
||||
no output, so an explicit :meth:`flush` call may be needed at times.
|
||||
|
||||
|
||||
FileHandler
|
||||
|
@ -1821,7 +1862,7 @@ extensions for Python installed.
|
|||
source of event log entries. However, if you do this, you will not be able
|
||||
to see the events as you intended in the Event Log Viewer - it needs to be
|
||||
able to access the registry to get the .dll name. The current version does
|
||||
not do this (in fact it doesn't do anything).
|
||||
not do this.
|
||||
|
||||
|
||||
.. method:: emit(record)
|
||||
|
|
|
@ -290,7 +290,7 @@ The module also defines two mathematical constants:
|
|||
:exc:`OverflowError`, ``math.log(0L)`` may raise :exc:`ValueError` instead.
|
||||
|
||||
All functions return a quiet *NaN* if at least one of the args is *NaN*.
|
||||
Signaling *NaN*s raise an exception. The exception type still depends on the
|
||||
Signaling *NaN*\s raise an exception. The exception type still depends on the
|
||||
platform and libm implementation. It's usually :exc:`ValueError` for *EDOM*
|
||||
and :exc:`OverflowError` for errno *ERANGE*.
|
||||
|
||||
|
|
1253
Doc/whatsnew/2.6.rst
1253
Doc/whatsnew/2.6.rst
File diff suppressed because it is too large
Load Diff
|
@ -715,6 +715,7 @@ class StreamHandler(Handler):
|
|||
to a stream. Note that this class does not close the stream, as
|
||||
sys.stdout or sys.stderr may be used.
|
||||
"""
|
||||
|
||||
def __init__(self, strm=None):
|
||||
"""
|
||||
Initialize the handler.
|
||||
|
@ -739,10 +740,11 @@ class StreamHandler(Handler):
|
|||
Emit a record.
|
||||
|
||||
If a formatter is specified, it is used to format the record.
|
||||
The record is then written to the stream with a trailing newline
|
||||
[N.B. this may be removed depending on feedback]. If exception
|
||||
information is present, it is formatted using
|
||||
traceback.print_exception and appended to the stream.
|
||||
The record is then written to the stream with a trailing newline. If
|
||||
exception information is present, it is formatted using
|
||||
traceback.print_exception and appended to the stream. If the stream
|
||||
has an 'encoding' attribute, it is used to encode the message before
|
||||
output to the stream.
|
||||
"""
|
||||
try:
|
||||
msg = self.format(record)
|
||||
|
@ -751,6 +753,9 @@ class StreamHandler(Handler):
|
|||
self.stream.write(fs % msg)
|
||||
else:
|
||||
try:
|
||||
if hasattr(self.stream, 'encoding'):
|
||||
self.stream.write(fs % msg.encode(self.stream.encoding))
|
||||
else:
|
||||
self.stream.write(fs % msg)
|
||||
except UnicodeError:
|
||||
self.stream.write(fs % msg.encode("UTF-8"))
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
# Calls to PyIter_Next, or direct calls to tp_iternext, on an object
|
||||
# which might no longer be an iterable because its 'next' method was
|
||||
# removed. These are all variants of Issue3720.
|
||||
|
||||
"""
|
||||
Run this script with an argument between 1 and <N> to test for
|
||||
different crashes.
|
||||
"""
|
||||
N = 8
|
||||
|
||||
import sys
|
||||
|
||||
class Foo(object):
|
||||
def __iter__(self):
|
||||
return self
|
||||
def next(self):
|
||||
del Foo.next
|
||||
return (1, 2)
|
||||
|
||||
def case1():
|
||||
list(enumerate(Foo()))
|
||||
|
||||
def case2():
|
||||
x, y = Foo()
|
||||
|
||||
def case3():
|
||||
filter(None, Foo())
|
||||
|
||||
def case4():
|
||||
map(None, Foo(), Foo())
|
||||
|
||||
def case5():
|
||||
max(Foo())
|
||||
|
||||
def case6():
|
||||
sum(Foo(), ())
|
||||
|
||||
def case7():
|
||||
dict(Foo())
|
||||
|
||||
def case8():
|
||||
sys.stdout.writelines(Foo())
|
||||
|
||||
# etc...
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2:
|
||||
print __doc__.replace('<N>', str(N))
|
||||
else:
|
||||
n = int(sys.argv[1])
|
||||
func = globals()['case%d' % n]
|
||||
func()
|
|
@ -100,6 +100,17 @@ class AutoFileTests(unittest.TestCase):
|
|||
# should raise on closed file
|
||||
self.assertRaises(ValueError, method)
|
||||
|
||||
def testOpendir(self):
|
||||
# Issue 3703: opening a directory should fill the errno
|
||||
# Windows always returns "[Errno 13]: Permission denied
|
||||
# Unix calls dircheck() and returns "[Errno 21]: Is a directory"
|
||||
try:
|
||||
_fileio._FileIO('.', 'r')
|
||||
except IOError as e:
|
||||
self.assertNotEqual(e.errno, 0)
|
||||
else:
|
||||
self.fail("Should have raised IOError")
|
||||
|
||||
|
||||
class OtherFileTests(unittest.TestCase):
|
||||
|
||||
|
|
|
@ -262,7 +262,7 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
|
|||
#endif
|
||||
self->fd = open(name, flags, 0666);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (self->fd < 0 || dircheck(self) < 0) {
|
||||
if (self->fd < 0) {
|
||||
#ifdef MS_WINDOWS
|
||||
PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
|
||||
#else
|
||||
|
@ -270,6 +270,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
|
|||
#endif
|
||||
goto error;
|
||||
}
|
||||
if(dircheck(self) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
goto done;
|
||||
|
|
|
@ -2031,7 +2031,7 @@ PyImport_ImportModuleNoBlock(const char *name)
|
|||
else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
||||
#ifdef WITH_THREAD
|
||||
/* check the import lock
|
||||
* me might be -1 but I ignore the error here, the lock function
|
||||
* takes care of the problem */
|
||||
|
@ -2047,6 +2047,9 @@ PyImport_ImportModuleNoBlock(const char *name)
|
|||
name);
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
return PyImport_ImportModule(name);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Forward declarations for helper routines */
|
||||
|
|
Loading…
Reference in New Issue