Skip to content

Commit

Permalink
Merged revisions 65012,65035,65037-65040,65048,65057,65077,65091-6509…
Browse files Browse the repository at this point in the history
…5,65097-65099,65127-65128,65131,65133-65136,65139,65149-65151,65155,65158-65159,65176-65178,65183-65184,65187-65190,65192,65194 via svnmerge from

svn+ssh://[email protected]/python/trunk

........
  r65012 | jesse.noller | 2008-07-16 15:24:06 +0200 (Wed, 16 Jul 2008) | 2 lines

  Apply patch for issue 3090: ARCHFLAGS parsing incorrect
........
  r65035 | georg.brandl | 2008-07-16 23:19:28 +0200 (Wed, 16 Jul 2008) | 2 lines

  python#3045: fix pydoc behavior for TEMP path with spaces.
........
  r65037 | georg.brandl | 2008-07-16 23:31:41 +0200 (Wed, 16 Jul 2008) | 2 lines

  #1608818: errno can get set by every call to readdir().
........
  r65038 | georg.brandl | 2008-07-17 00:04:20 +0200 (Thu, 17 Jul 2008) | 2 lines

  python#3305: self->stream can be NULL.
........
  r65039 | georg.brandl | 2008-07-17 00:09:17 +0200 (Thu, 17 Jul 2008) | 2 lines

  python#3345: fix docstring.
........
  r65040 | georg.brandl | 2008-07-17 00:33:18 +0200 (Thu, 17 Jul 2008) | 2 lines

  python#3312: fix two sqlite3 crashes.
........
  r65048 | georg.brandl | 2008-07-17 01:35:54 +0200 (Thu, 17 Jul 2008) | 2 lines

  python#3388: add a paragraph about using "with" for file objects.
........
  r65057 | gregory.p.smith | 2008-07-17 05:13:05 +0200 (Thu, 17 Jul 2008) | 2 lines

  news note for r63052
........
  r65077 | jesse.noller | 2008-07-17 23:01:05 +0200 (Thu, 17 Jul 2008) | 3 lines

  Fix issue 3395, update _debugInfo to be _debug_info
........
  r65091 | ronald.oussoren | 2008-07-18 07:48:03 +0200 (Fri, 18 Jul 2008) | 2 lines

  Last bit of a fix for issue3381 (addon for my patch in r65061)
........
  r65092 | vinay.sajip | 2008-07-18 10:59:06 +0200 (Fri, 18 Jul 2008) | 1 line

  Issue python#3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
........
  r65093 | vinay.sajip | 2008-07-18 11:00:00 +0200 (Fri, 18 Jul 2008) | 1 line

  Issue python#3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
........
  r65094 | vinay.sajip | 2008-07-18 11:00:35 +0200 (Fri, 18 Jul 2008) | 1 line

  Issue python#3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
........
  r65095 | vinay.sajip | 2008-07-18 11:01:10 +0200 (Fri, 18 Jul 2008) | 1 line

  Issue python#3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
........
  r65097 | georg.brandl | 2008-07-18 12:20:59 +0200 (Fri, 18 Jul 2008) | 2 lines

  Remove duplicate entry in __all__.
........
  r65098 | georg.brandl | 2008-07-18 12:29:30 +0200 (Fri, 18 Jul 2008) | 2 lines

  Correct attribute name.
........
  r65099 | georg.brandl | 2008-07-18 13:15:06 +0200 (Fri, 18 Jul 2008) | 3 lines

  Document the different meaning of precision for {:f} and {:g}.
  Also document how inf and nan are formatted. python#3404.
........
  r65127 | raymond.hettinger | 2008-07-19 02:42:03 +0200 (Sat, 19 Jul 2008) | 1 line

  Improve accuracy of gamma test function
........
  r65128 | raymond.hettinger | 2008-07-19 02:43:00 +0200 (Sat, 19 Jul 2008) | 1 line

  Add recipe to the itertools docs.
........
  r65131 | georg.brandl | 2008-07-19 12:08:55 +0200 (Sat, 19 Jul 2008) | 2 lines

  python#3378: in case of no memory, don't leak even more memory. :)
........
  r65133 | georg.brandl | 2008-07-19 14:39:10 +0200 (Sat, 19 Jul 2008) | 3 lines

  python#3302: fix segfaults when passing None for arguments that can't
  be NULL for the C functions.
........
  r65134 | georg.brandl | 2008-07-19 14:46:12 +0200 (Sat, 19 Jul 2008) | 2 lines

  python#3303: fix crash with invalid Py_DECREF in strcoll().
........
  r65135 | georg.brandl | 2008-07-19 15:00:22 +0200 (Sat, 19 Jul 2008) | 3 lines

  python#3319: don't raise ZeroDivisionError if number of rounds is so
  low that benchtime is zero.
........
  r65136 | georg.brandl | 2008-07-19 15:09:42 +0200 (Sat, 19 Jul 2008) | 3 lines

  python#3323: mention that if inheriting from a class without __slots__,
  the subclass will have a __dict__ available too.
........
  r65139 | georg.brandl | 2008-07-19 15:48:44 +0200 (Sat, 19 Jul 2008) | 2 lines

  Add ordering info for findall and finditer.
........
  r65149 | raymond.hettinger | 2008-07-20 01:21:57 +0200 (Sun, 20 Jul 2008) | 1 line

  Fix compress() recipe in docs to use itertools.
........
  r65150 | raymond.hettinger | 2008-07-20 01:58:47 +0200 (Sun, 20 Jul 2008) | 1 line

  Clean-up itertools docs and recipes.
........
  r65151 | gregory.p.smith | 2008-07-20 02:22:08 +0200 (Sun, 20 Jul 2008) | 9 lines

  fix issue3120 - don't truncate handles on 64-bit Windows.

  This is still messy, realistically PC/_subprocess.c should never cast pointers
  to python numbers and back at all.

  I don't have a 64-bit windows build environment because microsoft apparently
  thinks that should cost money.  Time to watch the buildbots.  It builds and
  passes tests on 32-bit windows.
........
  r65155 | georg.brandl | 2008-07-20 13:50:29 +0200 (Sun, 20 Jul 2008) | 2 lines

  #926501: add info where to put the docstring.
........
  r65158 | neal.norwitz | 2008-07-20 21:35:23 +0200 (Sun, 20 Jul 2008) | 1 line

  Fix a couple of names in error messages that were wrong
........
  r65159 | neal.norwitz | 2008-07-20 22:39:36 +0200 (Sun, 20 Jul 2008) | 1 line

  Fix misspeeld method name (negative)
........
  r65176 | amaury.forgeotdarc | 2008-07-21 23:36:24 +0200 (Mon, 21 Jul 2008) | 4 lines

  Increment version number in NEWS file, and move items that were added after 2.6b2.

  (I thought there was a script to automate this kind of updates)
........
  r65177 | amaury.forgeotdarc | 2008-07-22 00:00:38 +0200 (Tue, 22 Jul 2008) | 5 lines

  Issue2378: pdb would delete free variables when stepping into a class statement.

  The problem was introduced by r53954, the correction is to restore the symmetry between
  PyFrame_FastToLocals and PyFrame_LocalsToFast
........
  r65178 | benjamin.peterson | 2008-07-22 00:05:34 +0200 (Tue, 22 Jul 2008) | 1 line

  don't use assert statement
........
  r65183 | ronald.oussoren | 2008-07-22 09:06:00 +0200 (Tue, 22 Jul 2008) | 2 lines

  Fix buglet in fix for issue3381
........
  r65184 | ronald.oussoren | 2008-07-22 09:06:33 +0200 (Tue, 22 Jul 2008) | 2 lines

  Fix build issue on OSX 10.4, somehow this wasn't committed before.
........
  r65187 | raymond.hettinger | 2008-07-22 20:54:02 +0200 (Tue, 22 Jul 2008) | 1 line

  Remove out-of-date section on Exact/Inexact.
........
  r65188 | raymond.hettinger | 2008-07-22 21:00:47 +0200 (Tue, 22 Jul 2008) | 1 line

  Tuples now have both count() and index().
........
  r65189 | raymond.hettinger | 2008-07-22 21:03:05 +0200 (Tue, 22 Jul 2008) | 1 line

  Fix credits for math.sum()
........
  r65190 | raymond.hettinger | 2008-07-22 21:18:50 +0200 (Tue, 22 Jul 2008) | 1 line

  One more attribution.
........
  r65192 | benjamin.peterson | 2008-07-23 01:44:37 +0200 (Wed, 23 Jul 2008) | 1 line

  remove unneeded import
........
  r65194 | benjamin.peterson | 2008-07-23 15:25:06 +0200 (Wed, 23 Jul 2008) | 1 line

  use isinstance
........
  • Loading branch information
birkenfeld committed Jul 23, 2008
1 parent 4f6f34f commit 3dbca81
Show file tree
Hide file tree
Showing 35 changed files with 309 additions and 214 deletions.
8 changes: 8 additions & 0 deletions Doc/glossary.rst
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,14 @@ Glossary
of :class:`dict` much resembles that for :class:`list`, but the keys can
be any object with a :meth:`__hash__` function, not just integers starting
from zero. Called a hash in Perl.

docstring
A docstring ("documentation string") is a string literal that appears as
the first thing in a class or function suite. While ignored when the
suite is executed, it is recognized by the compiler and put into the
:attr:`__doc__` attribute of the class or function. Since it is available
via introspection, it is the canonical place for documentation of the
object.

duck-typing
Pythonic programming style that determines an object's type by inspection
Expand Down
87 changes: 37 additions & 50 deletions Doc/library/itertools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,11 @@ by combining :func:`map` and :func:`count` to form ``map(f, count())``.
Likewise, the functional tools are designed to work well with the high-speed
functions provided by the :mod:`operator` module.

The module author welcomes suggestions for other basic building blocks to be
added to future versions of the module.

Whether cast in pure python form or compiled code, tools that use iterators are
more memory efficient (and faster) than their list based counterparts. Adopting
more memory efficient (and often faster) than their list based counterparts. Adopting
the principles of just-in-time manufacturing, they create data when and where
needed instead of consuming memory with the computer equivalent of "inventory".

The performance advantage of iterators becomes more acute as the number of
elements increases -- at some point, lists grow large enough to severely impact
memory cache performance and start running slowly.


.. seealso::

Expand Down Expand Up @@ -517,55 +510,35 @@ which incur interpreter overhead.

.. testcode::

def take(n, seq):
return list(islice(seq, n))
def take(n, iterable):
"Return first n items of the iterable as a list"
return list(islice(iterable, n))

def enumerate(iterable):
return zip(count(), iterable)
def enumerate(iterable, start=0):
return zip(count(start), iterable)

def tabulate(function):
def tabulate(function, start=0):
"Return function(0), function(1), ..."
return map(function, count())

def items(mapping):
return zip(mapping.keys(), mapping.values())
return map(function, count(start))

def nth(iterable, n):
"Returns the nth item or raise StopIteration"
return next(islice(iterable, n, None))

def all(seq, pred=None):
"Returns True if pred(x) is true for every element in the iterable"
for elem in filterfalse(pred, seq):
return False
return True

def any(seq, pred=None):
"Returns True if pred(x) is true for at least one element in the iterable"
for elem in filter(pred, seq):
return True
return False

def no(seq, pred=None):
"Returns True if pred(x) is false for every element in the iterable"
for elem in filter(pred, seq):
return False
return True

def quantify(seq, pred=None):
"Count how many times the predicate is true in the sequence"
return sum(map(pred, seq))

def padnone(seq):
"Returns the nth item or empty list"
return list(islice(iterable, n, n+1))

def quantify(iterable, pred=bool):
"Count how many times the predicate is true"
return sum(map(pred, iterable))

def padnone(iterable):
"""Returns the sequence elements and then returns None indefinitely.

Useful for emulating the behavior of the built-in map() function.
"""
return chain(seq, repeat(None))
return chain(iterable, repeat(None))

def ncycles(seq, n):
def ncycles(iterable, n):
"Returns the sequence elements n times"
return chain.from_iterable(repeat(seq, n))
return chain.from_iterable(repeat(iterable, n))

def dotproduct(vec1, vec2):
return sum(map(operator.mul, vec1, vec2))
Expand Down Expand Up @@ -616,7 +589,21 @@ which incur interpreter overhead.

def compress(data, selectors):
"compress('abcdef', [1,0,1,0,1,1]) --> a c e f"
for d, s in zip(data, selectors):
if s:
yield d

decorated = zip(data, selectors)
filtered = filter(operator.itemgetter(1), decorated)
return map(operator.itemgetter(0), filtered)

def combinations_with_replacement(iterable, r):
"combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC"
pool = tuple(iterable)
n = len(pool)
indices = [0] * r
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != n - 1:
break
else:
return
indices[i:] = [indices[i] + 1] * (r - i)
yield tuple(pool[i] for i in indices)
6 changes: 5 additions & 1 deletion Doc/library/logging.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1647,7 +1647,7 @@ timed intervals.
The system will save old log files by appending extensions to the filename.
The extensions are date-and-time based, using the strftime format
``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the
rollover interval.
rollover interval.
If the *utc* argument is true, times in UTC will be used; otherwise
local time is used.

Expand Down Expand Up @@ -2315,6 +2315,10 @@ The ``class`` entry indicates the handler's class (as determined by :func:`eval`
in the ``logging`` package's namespace). The ``level`` is interpreted as for
loggers, and ``NOTSET`` is taken to mean "log everything".

.. versionchanged:: 2.6
Added support for resolving the handler's class as a dotted module and class
name.

The ``formatter`` entry indicates the key name of the formatter for this
handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
If a name is specified, it must appear in the ``[formatters]`` section and have
Expand Down
15 changes: 9 additions & 6 deletions Doc/library/re.rst
Original file line number Diff line number Diff line change
Expand Up @@ -571,17 +571,20 @@ form.
.. function:: findall(pattern, string[, flags])

Return all non-overlapping matches of *pattern* in *string*, as a list of
strings. If one or more groups are present in the pattern, return a list of
groups; this will be a list of tuples if the pattern has more than one group.
Empty matches are included in the result unless they touch the beginning of
another match.
strings. The *string* is scanned left-to-right, and matches are returned in
the order found. If one or more groups are present in the pattern, return a
list of groups; this will be a list of tuples if the pattern has more than
one group. Empty matches are included in the result unless they touch the
beginning of another match.


.. function:: finditer(pattern, string[, flags])

Return an :term:`iterator` yielding :class:`MatchObject` instances over all
non-overlapping matches for the RE *pattern* in *string*. Empty matches are
included in the result unless they touch the beginning of another match.
non-overlapping matches for the RE *pattern* in *string*. The *string* is
scanned left-to-right, and matches are returned in the order found. Empty
matches are included in the result unless they touch the beginning of another
match.


.. function:: sub(pattern, repl, string[, count])
Expand Down
20 changes: 12 additions & 8 deletions Doc/library/string.rst
Original file line number Diff line number Diff line change
Expand Up @@ -360,10 +360,11 @@ zero-padding. This is equivalent to an *alignment* type of ``'='`` and a *fill*
character of ``'0'``.

The *precision* is a decimal number indicating how many digits should be
displayed after the decimal point for a floating point value. For non-number
types the field indicates the maximum field size - in other words, how many
characters will be used from the field content. The *precision* is ignored for
integer values.
displayed after the decimal point for a floating point value formatted with
``'f'`` and ``'F'``, or before and after the decimal point for a floating point
value formatted with ``'g'`` or ``'G'``. For non-number types the field
indicates the maximum field size - in other words, how many characters will be
used from the field content. The *precision* is ignored for integer values.

Finally, the *type* determines how the data should be presented.

Expand Down Expand Up @@ -391,7 +392,7 @@ The available integer presentation types are:
| | the current locale setting to insert the appropriate |
| | number separator characters. |
+---------+----------------------------------------------------------+
| None | the same as ``'d'`` |
| None | The same as ``'d'``. |
+---------+----------------------------------------------------------+

The available presentation types for floating point and decimal values are:
Expand All @@ -412,10 +413,13 @@ The available presentation types for floating point and decimal values are:
+---------+----------------------------------------------------------+
| ``'g'`` | General format. This prints the number as a fixed-point |
| | number, unless the number is too large, in which case |
| | it switches to ``'e'`` exponent notation. |
| | it switches to ``'e'`` exponent notation. Infinity and |
| | NaN values are formatted as ``inf``, ``-inf`` and |
| | ``nan``, respectively. |
+---------+----------------------------------------------------------+
| ``'G'`` | General format. Same as ``'g'`` except switches to |
| | ``'E'`` if the number gets to large. |
| | ``'E'`` if the number gets to large. The representations |
| | of infinity and NaN are uppercased, too. |
+---------+----------------------------------------------------------+
| ``'n'`` | Number. This is the same as ``'g'``, except that it uses |
| | the current locale setting to insert the appropriate |
Expand All @@ -424,7 +428,7 @@ The available presentation types for floating point and decimal values are:
| ``'%'`` | Percentage. Multiplies the number by 100 and displays |
| | in fixed (``'f'``) format, followed by a percent sign. |
+---------+----------------------------------------------------------+
| None | the same as ``'g'`` |
| None | The same as ``'g'``. |
+---------+----------------------------------------------------------+


Expand Down
19 changes: 14 additions & 5 deletions Doc/reference/compound_stmts.rst
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ reference to the current global namespace as the global namespace to be used
when the function is called.

The function definition does not execute the function body; this gets executed
only when the function is called.
only when the function is called. [#]_

.. index::
statement: @
Expand Down Expand Up @@ -535,6 +535,7 @@ Class definitions
pair: name; binding
pair: execution; frame
single: inheritance
single: docstring

A class definition defines a class object (see section :ref:`types`):

Expand All @@ -552,10 +553,10 @@ to a class object or class type which allows subclassing. The class's suite is
then executed in a new execution frame (see section :ref:`naming`), using a
newly created local namespace and the original global namespace. (Usually, the
suite contains only function definitions.) When the class's suite finishes
execution, its execution frame is discarded but its local namespace is saved. A
class object is then created using the inheritance list for the base classes and
the saved local namespace for the attribute dictionary. The class name is bound
to this class object in the original local namespace.
execution, its execution frame is discarded but its local namespace is
saved. [#]_ A class object is then created using the inheritance list for the
base classes and the saved local namespace for the attribute dictionary. The
class name is bound to this class object in the original local namespace.

Classes can also be decorated; as with functions, ::

Expand Down Expand Up @@ -597,3 +598,11 @@ which is then bound to the class name.
.. [#] Currently, control "flows off the end" except in the case of an exception or the
execution of a :keyword:`return`, :keyword:`continue`, or :keyword:`break`
statement.
.. [#] A string literal appearing as the first statement in the function body is
transformed into the function's ``__doc__`` attribute and therefore the
function's :term:`docstring`.
.. [#] A string literal appearing as the first statement in the class body is
transformed into the namespace's ``__doc__`` item and therefore the class's
:term:`docstring`.
4 changes: 4 additions & 0 deletions Doc/reference/datamodel.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1435,6 +1435,10 @@ saved because *__dict__* is not created for each instance.
Notes on using *__slots__*
""""""""""""""""""""""""""

* When inheriting from a class without *__slots__*, the *__dict__* attribute of
that class will always be accessible, so a *__slots__* definition in the
subclass is meaningless.

* Without a *__dict__* variable, instances cannot be assigned new variables not
listed in the *__slots__* definition. Attempts to assign to an unlisted
variable name raises :exc:`AttributeError`. If dynamic assignment of new
Expand Down
10 changes: 10 additions & 0 deletions Doc/tutorial/inputoutput.rst
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,16 @@ attempts to use the file object will automatically fail. ::
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file

It is good practice to use the :keyword:`with` keyword when dealing with file
objects. This has the advantage that the file is properly closed after its
suite finishes, even if an exception is raised on the way. It is also much
shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks::

>>> with open('/tmp/workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True

File objects have some additional methods, such as :meth:`isatty` and
:meth:`truncate` which are less frequently used; consult the Library Reference
for a complete guide to file objects.
Expand Down
21 changes: 8 additions & 13 deletions Doc/whatsnew/2.6.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1324,14 +1324,6 @@ The most general ABC is :class:`Number`. It defines no operations at
all, and only exists to allow checking if an object is a number by
doing ``isinstance(obj, Number)``.

Numbers are further divided into :class:`Exact` and :class:`Inexact`.
Exact numbers can represent values precisely and operations never
round off the results or introduce tiny errors that may break the
commutativity and associativity properties; inexact numbers may
perform such rounding or introduce small errors. Integers, long
integers, and rational numbers are exact, while floating-point
and complex numbers are inexact.

:class:`Complex` is a subclass of :class:`Number`. Complex numbers
can undergo the basic operations of addition, subtraction,
multiplication, division, and exponentiation, and you can retrieve the
Expand Down Expand Up @@ -1449,13 +1441,15 @@ Here are all of the changes that Python 2.6 makes to the core Python language.
it will be returned if *iterator* has been exhausted; otherwise,
the :exc:`StopIteration` exception will be raised. (:issue:`2719`)

* Tuples now have an :meth:`index` method matching the list type's
:meth:`index` method::
* Tuples now have :meth:`index` and :meth:`count` methods matching the
list type's :meth:`index` and :meth:`count` methods::

>>> t = (0,1,2,3,4)
>>> t.index(3)
3

(Contributed by Raymond Hettinger)

* The built-in types now have improved support for extended slicing syntax,
where various combinations of ``(start, stop, step)`` are supplied.
Previously, the support was partial and certain corner cases wouldn't work.
Expand Down Expand Up @@ -1545,7 +1539,8 @@ Here are all of the changes that Python 2.6 makes to the core Python language.

* :func:`~math.sum` adds up the stream of numbers from an iterable,
and is careful to avoid loss of precision by calculating partial sums.
(Contributed by Jean Brouwers; :issue:`2819`.)
(Contributed by Jean Brouwers, Raymond Hettinger, and Mark Dickinson;
:issue:`2819`.)

* The inverse hyperbolic functions :func:`~math.acosh`, :func:`~math.asinh`
and :func:`~math.atanh`.
Expand Down Expand Up @@ -1596,8 +1591,8 @@ Here are all of the changes that Python 2.6 makes to the core Python language.
* The string :meth:`translate` method now accepts ``None`` as the
translation table parameter, which is treated as the identity
transformation. This makes it easier to carry out operations
that only delete characters. (Contributed by Bengt Richter;
:issue:`1193128`.)
that only delete characters. (Contributed by Bengt Richter and
implemented by Raymond Hettinger; :issue:`1193128`.)

* The built-in :func:`dir` function now checks for a :meth:`__dir__`
method on the objects it receives. This method must return a list
Expand Down
3 changes: 1 addition & 2 deletions Lib/distutils/unixccompiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,7 @@ def _darwin_compiler_fixup(compiler_so, cc_args):
if 'ARCHFLAGS' in os.environ and not stripArch:
# User specified different -arch flags in the environ,
# see also distutils.sysconfig
compiler_so = compiler_so + ' ' + os.environ['ARCHFLAGS']

compiler_so = compiler_so + os.environ['ARCHFLAGS'].split()

if stripSysroot:
try:
Expand Down
2 changes: 1 addition & 1 deletion Lib/imghdr.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

def what(file, h=None):
if h is None:
if type(file) == type(''):
if isinstance(file, str):
f = open(file, 'rb')
h = f.read(32)
else:
Expand Down
5 changes: 4 additions & 1 deletion Lib/logging/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,10 @@ def _install_handlers(cp, formatters):
fmt = cp.get(sectname, "formatter")
else:
fmt = ""
klass = eval(klass, vars(logging))
try:
klass = eval(klass, vars(logging))
except (AttributeError, NameError):
klass = _resolve(klass)
args = cp.get(sectname, "args")
args = eval(args, vars(logging))
h = klass(*args)
Expand Down
Loading

0 comments on commit 3dbca81

Please sign in to comment.