mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
ConfigParser renaming reversal part 3: move module into place and adapt imports.
This commit is contained in:
parent
995ee9dab0
commit
392c6fc02d
14 changed files with 68 additions and 126 deletions
|
@ -1,10 +1,7 @@
|
||||||
:mod:`configparser` --- Configuration file parser
|
:mod:`ConfigParser` --- Configuration file parser
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
.. module:: ConfigParser
|
.. module:: ConfigParser
|
||||||
:synopsis: Old name for the configparser module.
|
|
||||||
|
|
||||||
.. module:: configparser
|
|
||||||
:synopsis: Configuration file parser.
|
:synopsis: Configuration file parser.
|
||||||
|
|
||||||
.. moduleauthor:: Ken Manheimer <klm@zope.com>
|
.. moduleauthor:: Ken Manheimer <klm@zope.com>
|
||||||
|
@ -13,9 +10,10 @@
|
||||||
.. sectionauthor:: Christopher G. Petrilli <petrilli@amber.org>
|
.. sectionauthor:: Christopher G. Petrilli <petrilli@amber.org>
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
The :mod:`ConfigParser` module has been renamed to :mod:`configparser` in
|
|
||||||
Python 3.0. It is importable under both names in Python 2.6 and the rest of
|
The :mod:`ConfigParser` module has been renamed to `configparser` in Python
|
||||||
the 2.x series.
|
3.0. The :term:`2to3` tool will automatically adapt imports when converting
|
||||||
|
your sources to 3.0.
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
pair: .ini; file
|
pair: .ini; file
|
||||||
|
@ -233,9 +231,9 @@ RawConfigParser Objects
|
||||||
load the required file or files using :meth:`readfp` before calling :meth:`read`
|
load the required file or files using :meth:`readfp` before calling :meth:`read`
|
||||||
for any optional files::
|
for any optional files::
|
||||||
|
|
||||||
import configparser, os
|
import ConfigParser, os
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
config = ConfigParser.ConfigParser()
|
||||||
config.readfp(open('defaults.cfg'))
|
config.readfp(open('defaults.cfg'))
|
||||||
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')])
|
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')])
|
||||||
|
|
||||||
|
@ -375,9 +373,9 @@ Examples
|
||||||
|
|
||||||
An example of writing to a configuration file::
|
An example of writing to a configuration file::
|
||||||
|
|
||||||
import configparser
|
import ConfigParser
|
||||||
|
|
||||||
config = configparser.RawConfigParser()
|
config = ConfigParser.RawConfigParser()
|
||||||
|
|
||||||
# When adding sections or items, add them in the reverse order of
|
# When adding sections or items, add them in the reverse order of
|
||||||
# how you want them to be displayed in the actual file.
|
# how you want them to be displayed in the actual file.
|
||||||
|
@ -400,9 +398,9 @@ An example of writing to a configuration file::
|
||||||
|
|
||||||
An example of reading the configuration file again::
|
An example of reading the configuration file again::
|
||||||
|
|
||||||
import configparser
|
import ConfigParser
|
||||||
|
|
||||||
config = configparser.RawConfigParser()
|
config = ConfigParser.RawConfigParser()
|
||||||
config.read('example.cfg')
|
config.read('example.cfg')
|
||||||
|
|
||||||
# getfloat() raises an exception if the value is not a float
|
# getfloat() raises an exception if the value is not a float
|
||||||
|
@ -419,9 +417,9 @@ An example of reading the configuration file again::
|
||||||
To get interpolation, you will need to use a :class:`ConfigParser` or
|
To get interpolation, you will need to use a :class:`ConfigParser` or
|
||||||
:class:`SafeConfigParser`::
|
:class:`SafeConfigParser`::
|
||||||
|
|
||||||
import configparser
|
import ConfigParser
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
config = ConfigParser.ConfigParser()
|
||||||
config.read('example.cfg')
|
config.read('example.cfg')
|
||||||
|
|
||||||
# Set the third, optional argument of get to 1 if you wish to use raw mode.
|
# Set the third, optional argument of get to 1 if you wish to use raw mode.
|
||||||
|
@ -436,10 +434,10 @@ To get interpolation, you will need to use a :class:`ConfigParser` or
|
||||||
Defaults are available in all three types of ConfigParsers. They are used in
|
Defaults are available in all three types of ConfigParsers. They are used in
|
||||||
interpolation if an option used is not defined elsewhere. ::
|
interpolation if an option used is not defined elsewhere. ::
|
||||||
|
|
||||||
import configparser
|
import ConfigParser
|
||||||
|
|
||||||
# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
|
# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
|
||||||
config = configparser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
|
config = ConfigParser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
|
||||||
config.read('example.cfg')
|
config.read('example.cfg')
|
||||||
|
|
||||||
print config.get('Section1', 'foo') # -> "Python is fun!"
|
print config.get('Section1', 'foo') # -> "Python is fun!"
|
||||||
|
@ -452,7 +450,7 @@ The function ``opt_move`` below can be used to move options between sections::
|
||||||
def opt_move(config, section1, section2, option):
|
def opt_move(config, section1, section2, option):
|
||||||
try:
|
try:
|
||||||
config.set(section2, option, config.get(section1, option, 1))
|
config.set(section2, option, config.get(section1, option, 1))
|
||||||
except configparser.NoSectionError:
|
except ConfigParser.NoSectionError:
|
||||||
# Create non-existent section
|
# Create non-existent section
|
||||||
config.add_section(section2)
|
config.add_section(section2)
|
||||||
opt_move(config, section1, section2, option)
|
opt_move(config, section1, section2, option)
|
||||||
|
|
|
@ -2240,12 +2240,12 @@ in :mod:`logging` itself) and defining handlers which are declared either in
|
||||||
|
|
||||||
.. function:: fileConfig(fname[, defaults])
|
.. function:: fileConfig(fname[, defaults])
|
||||||
|
|
||||||
Reads the logging configuration from a :mod:`configparser`\-format file named
|
Reads the logging configuration from a ConfigParser-format file named *fname*.
|
||||||
*fname*. This function can be called several times from an application,
|
This function can be called several times from an application, allowing an end
|
||||||
allowing an end user the ability to select from various pre-canned
|
user the ability to select from various pre-canned configurations (if the
|
||||||
configurations (if the developer provides a mechanism to present the choices
|
developer provides a mechanism to present the choices and load the chosen
|
||||||
and load the chosen configuration). Defaults to be passed to the ConfigParser
|
configuration). Defaults to be passed to ConfigParser can be specified in the
|
||||||
can be specified in the *defaults* argument.
|
*defaults* argument.
|
||||||
|
|
||||||
|
|
||||||
.. function:: listen([port])
|
.. function:: listen([port])
|
||||||
|
@ -2275,20 +2275,18 @@ in :mod:`logging` itself) and defining handlers which are declared either in
|
||||||
Configuration file format
|
Configuration file format
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The configuration file format understood by :func:`fileConfig` is
|
The configuration file format understood by :func:`fileConfig` is based on
|
||||||
based on :mod:`configparser` functionality. The file must contain
|
ConfigParser functionality. The file must contain sections called ``[loggers]``,
|
||||||
sections called ``[loggers]``, ``[handlers]`` and ``[formatters]``
|
``[handlers]`` and ``[formatters]`` which identify by name the entities of each
|
||||||
which identify by name the entities of each type which are defined in
|
type which are defined in the file. For each such entity, there is a separate
|
||||||
the file. For each such entity, there is a separate section which
|
section which identified how that entity is configured. Thus, for a logger named
|
||||||
identified how that entity is configured. Thus, for a logger named
|
``log01`` in the ``[loggers]`` section, the relevant configuration details are
|
||||||
``log01`` in the ``[loggers]`` section, the relevant configuration
|
held in a section ``[logger_log01]``. Similarly, a handler called ``hand01`` in
|
||||||
details are held in a section ``[logger_log01]``. Similarly, a handler
|
the ``[handlers]`` section will have its configuration held in a section called
|
||||||
called ``hand01`` in the ``[handlers]`` section will have its
|
``[handler_hand01]``, while a formatter called ``form01`` in the
|
||||||
configuration held in a section called ``[handler_hand01]``, while a
|
``[formatters]`` section will have its configuration specified in a section
|
||||||
formatter called ``form01`` in the ``[formatters]`` section will have
|
called ``[formatter_form01]``. The root logger configuration must be specified
|
||||||
its configuration specified in a section called
|
in a section called ``[logger_root]``.
|
||||||
``[formatter_form01]``. The root logger configuration must be
|
|
||||||
specified in a section called ``[logger_root]``.
|
|
||||||
|
|
||||||
Examples of these sections in the file are given below. ::
|
Examples of these sections in the file are given below. ::
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ The :mod:`shlex` module defines the following class:
|
||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
|
||||||
Module :mod:`configparser`
|
Module :mod:`ConfigParser`
|
||||||
Parser for configuration files similar to the Windows :file:`.ini` files.
|
Parser for configuration files similar to the Windows :file:`.ini` files.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,6 @@ import httplib
|
||||||
import base64
|
import base64
|
||||||
import urlparse
|
import urlparse
|
||||||
import cStringIO as StringIO
|
import cStringIO as StringIO
|
||||||
try:
|
|
||||||
from configparser import ConfigParser
|
|
||||||
except ImportError:
|
|
||||||
# For backward-compatibility with Python versions < 2.6.
|
|
||||||
from ConfigParser import ConfigParser
|
from ConfigParser import ConfigParser
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,6 @@ that uses .pypirc in the distutils.command package.
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
try:
|
|
||||||
from configparser import ConfigParser
|
|
||||||
except ImportError:
|
|
||||||
# For backward-compatibility with Python versions < 2.6.
|
|
||||||
from ConfigParser import ConfigParser
|
from ConfigParser import ConfigParser
|
||||||
|
|
||||||
from distutils.cmd import Command
|
from distutils.cmd import Command
|
||||||
|
|
|
@ -358,10 +358,6 @@ Common commands: (see '--help-commands' for more)
|
||||||
|
|
||||||
|
|
||||||
def parse_config_files (self, filenames=None):
|
def parse_config_files (self, filenames=None):
|
||||||
try:
|
|
||||||
from configparser import ConfigParser
|
|
||||||
except ImportError:
|
|
||||||
# For backward-compatibility with Python versions < 2.6.
|
|
||||||
from ConfigParser import ConfigParser
|
from ConfigParser import ConfigParser
|
||||||
|
|
||||||
if filenames is None:
|
if filenames is None:
|
||||||
|
|
|
@ -21,7 +21,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import string
|
import string
|
||||||
import macosxSupport
|
import macosxSupport
|
||||||
from configparser import ConfigParser, NoOptionError, NoSectionError
|
from ConfigParser import ConfigParser, NoOptionError, NoSectionError
|
||||||
|
|
||||||
class InvalidConfigType(Exception): pass
|
class InvalidConfigType(Exception): pass
|
||||||
class InvalidConfigSet(Exception): pass
|
class InvalidConfigSet(Exception): pass
|
||||||
|
|
|
@ -65,9 +65,9 @@ def fileConfig(fname, defaults=None):
|
||||||
rather than a filename, in which case the file-like object will be read
|
rather than a filename, in which case the file-like object will be read
|
||||||
using readfp.
|
using readfp.
|
||||||
"""
|
"""
|
||||||
import configparser
|
import ConfigParser
|
||||||
|
|
||||||
cp = configparser.ConfigParser(defaults)
|
cp = ConfigParser.ConfigParser(defaults)
|
||||||
if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
|
if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
|
||||||
cp.readfp(fname)
|
cp.readfp(fname)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -37,7 +37,7 @@ class AllTest(unittest.TestCase):
|
||||||
self.check_all("BaseHTTPServer")
|
self.check_all("BaseHTTPServer")
|
||||||
self.check_all("Bastion")
|
self.check_all("Bastion")
|
||||||
self.check_all("CGIHTTPServer")
|
self.check_all("CGIHTTPServer")
|
||||||
self.check_all("configparser")
|
self.check_all("ConfigParser")
|
||||||
self.check_all("Cookie")
|
self.check_all("Cookie")
|
||||||
self.check_all("MimeWriter")
|
self.check_all("MimeWriter")
|
||||||
self.check_all("Queue")
|
self.check_all("Queue")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import configparser
|
import ConfigParser
|
||||||
import StringIO
|
import StringIO
|
||||||
import unittest
|
import unittest
|
||||||
import UserDict
|
import UserDict
|
||||||
|
@ -94,7 +94,7 @@ class TestCaseBase(unittest.TestCase):
|
||||||
"remove_option() failed to report non-existance of option"
|
"remove_option() failed to report non-existance of option"
|
||||||
" that was removed")
|
" that was removed")
|
||||||
|
|
||||||
self.assertRaises(configparser.NoSectionError,
|
self.assertRaises(ConfigParser.NoSectionError,
|
||||||
cf.remove_option, 'No Such Section', 'foo')
|
cf.remove_option, 'No Such Section', 'foo')
|
||||||
|
|
||||||
eq(cf.get('Long Line', 'foo'),
|
eq(cf.get('Long Line', 'foo'),
|
||||||
|
@ -147,17 +147,17 @@ class TestCaseBase(unittest.TestCase):
|
||||||
|
|
||||||
def test_parse_errors(self):
|
def test_parse_errors(self):
|
||||||
self.newconfig()
|
self.newconfig()
|
||||||
self.parse_error(configparser.ParsingError,
|
self.parse_error(ConfigParser.ParsingError,
|
||||||
"[Foo]\n extra-spaces: splat\n")
|
"[Foo]\n extra-spaces: splat\n")
|
||||||
self.parse_error(configparser.ParsingError,
|
self.parse_error(ConfigParser.ParsingError,
|
||||||
"[Foo]\n extra-spaces= splat\n")
|
"[Foo]\n extra-spaces= splat\n")
|
||||||
self.parse_error(configparser.ParsingError,
|
self.parse_error(ConfigParser.ParsingError,
|
||||||
"[Foo]\noption-without-value\n")
|
"[Foo]\noption-without-value\n")
|
||||||
self.parse_error(configparser.ParsingError,
|
self.parse_error(ConfigParser.ParsingError,
|
||||||
"[Foo]\n:value-without-option-name\n")
|
"[Foo]\n:value-without-option-name\n")
|
||||||
self.parse_error(configparser.ParsingError,
|
self.parse_error(ConfigParser.ParsingError,
|
||||||
"[Foo]\n=value-without-option-name\n")
|
"[Foo]\n=value-without-option-name\n")
|
||||||
self.parse_error(configparser.MissingSectionHeaderError,
|
self.parse_error(ConfigParser.MissingSectionHeaderError,
|
||||||
"No Section!\n")
|
"No Section!\n")
|
||||||
|
|
||||||
def parse_error(self, exc, src):
|
def parse_error(self, exc, src):
|
||||||
|
@ -170,13 +170,13 @@ class TestCaseBase(unittest.TestCase):
|
||||||
"new ConfigParser should have no defined sections")
|
"new ConfigParser should have no defined sections")
|
||||||
self.failIf(cf.has_section("Foo"),
|
self.failIf(cf.has_section("Foo"),
|
||||||
"new ConfigParser should have no acknowledged sections")
|
"new ConfigParser should have no acknowledged sections")
|
||||||
self.assertRaises(configparser.NoSectionError,
|
self.assertRaises(ConfigParser.NoSectionError,
|
||||||
cf.options, "Foo")
|
cf.options, "Foo")
|
||||||
self.assertRaises(configparser.NoSectionError,
|
self.assertRaises(ConfigParser.NoSectionError,
|
||||||
cf.set, "foo", "bar", "value")
|
cf.set, "foo", "bar", "value")
|
||||||
self.get_error(configparser.NoSectionError, "foo", "bar")
|
self.get_error(ConfigParser.NoSectionError, "foo", "bar")
|
||||||
cf.add_section("foo")
|
cf.add_section("foo")
|
||||||
self.get_error(configparser.NoOptionError, "foo", "bar")
|
self.get_error(ConfigParser.NoOptionError, "foo", "bar")
|
||||||
|
|
||||||
def get_error(self, exc, section, option):
|
def get_error(self, exc, section, option):
|
||||||
try:
|
try:
|
||||||
|
@ -215,7 +215,7 @@ class TestCaseBase(unittest.TestCase):
|
||||||
def test_weird_errors(self):
|
def test_weird_errors(self):
|
||||||
cf = self.newconfig()
|
cf = self.newconfig()
|
||||||
cf.add_section("Foo")
|
cf.add_section("Foo")
|
||||||
self.assertRaises(configparser.DuplicateSectionError,
|
self.assertRaises(ConfigParser.DuplicateSectionError,
|
||||||
cf.add_section, "Foo")
|
cf.add_section, "Foo")
|
||||||
|
|
||||||
def test_write(self):
|
def test_write(self):
|
||||||
|
@ -324,7 +324,7 @@ class TestCaseBase(unittest.TestCase):
|
||||||
|
|
||||||
|
|
||||||
class ConfigParserTestCase(TestCaseBase):
|
class ConfigParserTestCase(TestCaseBase):
|
||||||
config_class = configparser.ConfigParser
|
config_class = ConfigParser.ConfigParser
|
||||||
|
|
||||||
def test_interpolation(self):
|
def test_interpolation(self):
|
||||||
cf = self.get_interpolation_config()
|
cf = self.get_interpolation_config()
|
||||||
|
@ -335,11 +335,11 @@ class ConfigParserTestCase(TestCaseBase):
|
||||||
"something with lots of interpolation (9 steps)")
|
"something with lots of interpolation (9 steps)")
|
||||||
eq(cf.get("Foo", "bar10"),
|
eq(cf.get("Foo", "bar10"),
|
||||||
"something with lots of interpolation (10 steps)")
|
"something with lots of interpolation (10 steps)")
|
||||||
self.get_error(configparser.InterpolationDepthError, "Foo", "bar11")
|
self.get_error(ConfigParser.InterpolationDepthError, "Foo", "bar11")
|
||||||
|
|
||||||
def test_interpolation_missing_value(self):
|
def test_interpolation_missing_value(self):
|
||||||
cf = self.get_interpolation_config()
|
cf = self.get_interpolation_config()
|
||||||
e = self.get_error(configparser.InterpolationError,
|
e = self.get_error(ConfigParser.InterpolationError,
|
||||||
"Interpolation Error", "name")
|
"Interpolation Error", "name")
|
||||||
self.assertEqual(e.reference, "reference")
|
self.assertEqual(e.reference, "reference")
|
||||||
self.assertEqual(e.section, "Interpolation Error")
|
self.assertEqual(e.section, "Interpolation Error")
|
||||||
|
@ -375,7 +375,7 @@ class ConfigParserTestCase(TestCaseBase):
|
||||||
|
|
||||||
|
|
||||||
class RawConfigParserTestCase(TestCaseBase):
|
class RawConfigParserTestCase(TestCaseBase):
|
||||||
config_class = configparser.RawConfigParser
|
config_class = ConfigParser.RawConfigParser
|
||||||
|
|
||||||
def test_interpolation(self):
|
def test_interpolation(self):
|
||||||
cf = self.get_interpolation_config()
|
cf = self.get_interpolation_config()
|
||||||
|
@ -410,7 +410,7 @@ class RawConfigParserTestCase(TestCaseBase):
|
||||||
|
|
||||||
|
|
||||||
class SafeConfigParserTestCase(ConfigParserTestCase):
|
class SafeConfigParserTestCase(ConfigParserTestCase):
|
||||||
config_class = configparser.SafeConfigParser
|
config_class = ConfigParser.SafeConfigParser
|
||||||
|
|
||||||
def test_safe_interpolation(self):
|
def test_safe_interpolation(self):
|
||||||
# See http://www.python.org/sf/511737
|
# See http://www.python.org/sf/511737
|
||||||
|
|
|
@ -213,48 +213,9 @@ class TestStdlibRemovals(unittest.TestCase):
|
||||||
self.assertEquals(str(w.message), msg)
|
self.assertEquals(str(w.message), msg)
|
||||||
|
|
||||||
|
|
||||||
class TestStdlibRenames(unittest.TestCase):
|
|
||||||
|
|
||||||
renames = {'ConfigParser': 'configparser'}
|
|
||||||
|
|
||||||
def check_rename(self, module_name, new_module_name):
|
|
||||||
"""Make sure that:
|
|
||||||
- A DeprecationWarning is raised when importing using the
|
|
||||||
old 2.x module name.
|
|
||||||
- The module can be imported using the new 3.x name.
|
|
||||||
- The warning message specify both names.
|
|
||||||
"""
|
|
||||||
with CleanImport(module_name):
|
|
||||||
with catch_warning(record=False) as w:
|
|
||||||
warnings.filterwarnings("error", ".+ renamed to",
|
|
||||||
DeprecationWarning)
|
|
||||||
try:
|
|
||||||
__import__(module_name, level=0)
|
|
||||||
except DeprecationWarning as exc:
|
|
||||||
self.assert_(module_name in exc.args[0])
|
|
||||||
self.assert_(new_module_name in exc.args[0])
|
|
||||||
else:
|
|
||||||
self.fail("DeprecationWarning not raised for %s" %
|
|
||||||
module_name)
|
|
||||||
with CleanImport(new_module_name):
|
|
||||||
try:
|
|
||||||
__import__(new_module_name, level=0)
|
|
||||||
except ImportError:
|
|
||||||
self.fail("cannot import %s with its 3.x name, %s" %
|
|
||||||
module_name, new_module_name)
|
|
||||||
except DeprecationWarning:
|
|
||||||
self.fail("unexpected DeprecationWarning raised for %s" %
|
|
||||||
module_name)
|
|
||||||
|
|
||||||
def test_module_renames(self):
|
|
||||||
for module_name, new_module_name in self.renames.items():
|
|
||||||
self.check_rename(module_name, new_module_name)
|
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(TestPy3KWarnings,
|
run_unittest(TestPy3KWarnings,
|
||||||
TestStdlibRemovals,
|
TestStdlibRemovals)
|
||||||
TestStdlibRenames)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -135,9 +135,6 @@ Library
|
||||||
- The DEVICE, GL, gl, and cgen modules (which indirectly includes
|
- The DEVICE, GL, gl, and cgen modules (which indirectly includes
|
||||||
cgensupport) have been deprecated for removal in Python 3.0.
|
cgensupport) have been deprecated for removal in Python 3.0.
|
||||||
|
|
||||||
- The ConfigParser module has been renamed 'configparser'. The old
|
|
||||||
name is now deprecated.
|
|
||||||
|
|
||||||
- The CL, CL_old, and cl modules for IRIX have been deprecated for
|
- The CL, CL_old, and cl modules for IRIX have been deprecated for
|
||||||
removal in Python 3.0.
|
removal in Python 3.0.
|
||||||
|
|
||||||
|
@ -1904,13 +1901,13 @@ Library
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
- Patch #1657: added select.epoll and select.kqueue
|
- Patch #1657: added select.epoll and select.kqueue.
|
||||||
|
|
||||||
- Patch #1506171: added operator.methodcaller().
|
- Patch #1506171: added operator.methodcaller().
|
||||||
|
|
||||||
- Patch #1826: operator.attrgetter() now supports dotted attribute paths.
|
- Patch #1826: operator.attrgetter() now supports dotted attribute paths.
|
||||||
|
|
||||||
- Patch #1957: syslogmodule: Release GIL when calling syslog(3)
|
- Patch #1957: syslogmodule: Release GIL when calling syslog(3).
|
||||||
|
|
||||||
- Bug #2112: mmap.error is now a subclass of EnvironmentError and not
|
- Bug #2112: mmap.error is now a subclass of EnvironmentError and not
|
||||||
a direct EnvironmentError.
|
a direct EnvironmentError.
|
||||||
|
|
|
@ -1862,7 +1862,7 @@ codecs Lookup existing Unicode encodings and register new ones.
|
||||||
colorsys Conversion functions between RGB and other color systems.
|
colorsys Conversion functions between RGB and other color systems.
|
||||||
commands Tools for executing UNIX commands .
|
commands Tools for executing UNIX commands .
|
||||||
compileall Force "compilation" of all .py files in a directory.
|
compileall Force "compilation" of all .py files in a directory.
|
||||||
configparser Configuration file parser (much like windows .ini files)
|
ConfigParser Configuration file parser (much like windows .ini files)
|
||||||
copy Generic shallow and deep copying operations.
|
copy Generic shallow and deep copying operations.
|
||||||
copy_reg Helper to provide extensibility for pickle/cPickle.
|
copy_reg Helper to provide extensibility for pickle/cPickle.
|
||||||
csv Read and write files with comma separated values.
|
csv Read and write files with comma separated values.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue