Kaydet (Commit) c649ec5b authored tarafından Nick Coghlan's avatar Nick Coghlan

Apply modified version of Collin Winter's patch #1478788

Renames functional extension module to _functools and adds a Python
functools module so that utility functions like update_wrapper can be
added easily.
üst c7c51147
...@@ -262,6 +262,7 @@ LIBFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \ ...@@ -262,6 +262,7 @@ LIBFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
lib/libsimplexmlrpc.tex \ lib/libsimplexmlrpc.tex \
lib/libdocxmlrpc.tex \ lib/libdocxmlrpc.tex \
lib/libpyexpat.tex \ lib/libpyexpat.tex \
lib/libfunctools.tex \
lib/xmldom.tex \ lib/xmldom.tex \
lib/xmldomminidom.tex \ lib/xmldomminidom.tex \
lib/xmldompulldom.tex \ lib/xmldompulldom.tex \
......
...@@ -129,8 +129,8 @@ and how to embed it in other applications. ...@@ -129,8 +129,8 @@ and how to embed it in other applications.
% Functions, Functional, Generators and Iterators % Functions, Functional, Generators and Iterators
% XXX intro functional % XXX intro functional
\input{libitertools} \input{libitertools}
\input{libfunctional} \input{libfunctools}
\input{liboperator} % from runtime - better with itertools and functional \input{liboperator} % from runtime - better with itertools and functools
% ============= % =============
......
\section{\module{functional} --- \section{\module{functools} ---
Higher order functions and operations on callable objects.} Higher order functions and operations on callable objects.}
\declaremodule{standard}{functional} % standard library, in Python \declaremodule{standard}{functools} % standard library, in Python
\moduleauthor{Peter Harris}{scav@blueyonder.co.uk} \moduleauthor{Peter Harris}{scav@blueyonder.co.uk}
\moduleauthor{Raymond Hettinger}{python@rcn.com} \moduleauthor{Raymond Hettinger}{python@rcn.com}
...@@ -11,12 +11,12 @@ ...@@ -11,12 +11,12 @@
\versionadded{2.5} \versionadded{2.5}
The \module{functional} module is for higher-order functions: functions The \module{functools} module is for higher-order functions: functions
that act on or return other functions. In general, any callable object can that act on or return other functions. In general, any callable object can
be treated as a function for the purposes of this module. be treated as a function for the purposes of this module.
The \module{functional} module defines the following function: The \module{functools} module defines the following function:
\begin{funcdesc}{partial}{func\optional{,*args}\optional{, **keywords}} \begin{funcdesc}{partial}{func\optional{,*args}\optional{, **keywords}}
Return a new \class{partial} object which when called will behave like Return a new \class{partial} object which when called will behave like
......
import functional import functools
import unittest import unittest
from test import test_support from test import test_support
from weakref import proxy from weakref import proxy
...@@ -21,7 +21,7 @@ def capture(*args, **kw): ...@@ -21,7 +21,7 @@ def capture(*args, **kw):
class TestPartial(unittest.TestCase): class TestPartial(unittest.TestCase):
thetype = functional.partial thetype = functools.partial
def test_basic_examples(self): def test_basic_examples(self):
p = self.thetype(capture, 1, 2, a=10, b=20) p = self.thetype(capture, 1, 2, a=10, b=20)
...@@ -140,7 +140,7 @@ class TestPartial(unittest.TestCase): ...@@ -140,7 +140,7 @@ class TestPartial(unittest.TestCase):
join = self.thetype(''.join) join = self.thetype(''.join)
self.assertEqual(join(data), '0123456789') self.assertEqual(join(data), '0123456789')
class PartialSubclass(functional.partial): class PartialSubclass(functools.partial):
pass pass
class TestPartialSubclass(TestPartial): class TestPartialSubclass(TestPartial):
......
...@@ -4,10 +4,10 @@ Python News ...@@ -4,10 +4,10 @@ Python News
(editors: check NEWS.help for information about editing NEWS using ReST.) (editors: check NEWS.help for information about editing NEWS using ReST.)
What's New in Python 2.5 alpha 3? What's New in Python 2.5 beta 1?
================================= =================================
*Release date: XX-MAY-2006* *Release date: XX-JUN-2006*
Core and builtins Core and builtins
----------------- -----------------
...@@ -62,6 +62,11 @@ Core and builtins ...@@ -62,6 +62,11 @@ Core and builtins
Extension Modules Extension Modules
----------------- -----------------
- Patch #1478788 (modified version): The functional extension module has
been renamed to _functools and a functools Python wrapper module added.
This provides a home for additional function related utilities that are
not specifically about functional programming. See PEP 309.
- Patch #1493701: performance enhancements for struct module. - Patch #1493701: performance enhancements for struct module.
- Patch #1490224: time.altzone is now set correctly on Cygwin. - Patch #1490224: time.altzone is now set correctly on Cygwin.
...@@ -82,6 +87,7 @@ Extension Modules ...@@ -82,6 +87,7 @@ Extension Modules
- Calling Tk_Init twice is refused if the first call failed as that - Calling Tk_Init twice is refused if the first call failed as that
may deadlock. may deadlock.
Library Library
------- -------
...@@ -142,6 +148,8 @@ Tools ...@@ -142,6 +148,8 @@ Tools
Documentation Documentation
------------- -------------
What's New in Python 2.5 alpha 2? What's New in Python 2.5 alpha 2?
================================= =================================
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
#include "Python.h" #include "Python.h"
#include "structmember.h" #include "structmember.h"
/* Functional module written and maintained /* _functools module written and maintained
by Hye-Shik Chang <perky@FreeBSD.org> by Hye-Shik Chang <perky@FreeBSD.org>
with adaptations by Raymond Hettinger <python@rcn.com> with adaptations by Raymond Hettinger <python@rcn.com>
Copyright (c) 2004, 2005 Python Software Foundation. Copyright (c) 2004, 2005, 2006 Python Software Foundation.
All rights reserved. All rights reserved.
*/ */
...@@ -199,7 +199,7 @@ static PyGetSetDef partial_getsetlist[] = { ...@@ -199,7 +199,7 @@ static PyGetSetDef partial_getsetlist[] = {
static PyTypeObject partial_type = { static PyTypeObject partial_type = {
PyObject_HEAD_INIT(NULL) PyObject_HEAD_INIT(NULL)
0, /* ob_size */ 0, /* ob_size */
"functional.partial", /* tp_name */ "functools.partial", /* tp_name */
sizeof(partialobject), /* tp_basicsize */ sizeof(partialobject), /* tp_basicsize */
0, /* tp_itemsize */ 0, /* tp_itemsize */
/* methods */ /* methods */
...@@ -245,14 +245,14 @@ static PyTypeObject partial_type = { ...@@ -245,14 +245,14 @@ static PyTypeObject partial_type = {
/* module level code ********************************************************/ /* module level code ********************************************************/
PyDoc_STRVAR(module_doc, PyDoc_STRVAR(module_doc,
"Tools for functional programming."); "Tools that operate on functions.");
static PyMethodDef module_methods[] = { static PyMethodDef module_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyMODINIT_FUNC PyMODINIT_FUNC
initfunctional(void) init_functools(void)
{ {
int i; int i;
PyObject *m; PyObject *m;
...@@ -262,7 +262,7 @@ initfunctional(void) ...@@ -262,7 +262,7 @@ initfunctional(void)
NULL NULL
}; };
m = Py_InitModule3("functional", module_methods, module_doc); m = Py_InitModule3("_functools", module_methods, module_doc);
if (m == NULL) if (m == NULL)
return; return;
......
...@@ -313,7 +313,7 @@ SOURCE=..\..\Objects\funcobject.c ...@@ -313,7 +313,7 @@ SOURCE=..\..\Objects\funcobject.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\Modules\functionalmodule.c SOURCE=..\..\Modules\_functoolsmodule.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -54,7 +54,7 @@ extern void initparser(void); ...@@ -54,7 +54,7 @@ extern void initparser(void);
extern void init_winreg(void); extern void init_winreg(void);
extern void init_struct(void); extern void init_struct(void);
extern void initdatetime(void); extern void initdatetime(void);
extern void initfunctional(void); extern void init_functools(void);
extern void initzlib(void); extern void initzlib(void);
extern void init_multibytecodec(void); extern void init_multibytecodec(void);
...@@ -132,7 +132,7 @@ struct _inittab _PyImport_Inittab[] = { ...@@ -132,7 +132,7 @@ struct _inittab _PyImport_Inittab[] = {
{"_winreg", init_winreg}, {"_winreg", init_winreg},
{"_struct", init_struct}, {"_struct", init_struct},
{"datetime", initdatetime}, {"datetime", initdatetime},
{"functional", initfunctional}, {"_functools", init_functools},
{"xxsubtype", initxxsubtype}, {"xxsubtype", initxxsubtype},
{"zipimport", initzipimport}, {"zipimport", initzipimport},
......
...@@ -515,10 +515,7 @@ ...@@ -515,10 +515,7 @@
RelativePath="..\Objects\funcobject.c"> RelativePath="..\Objects\funcobject.c">
</File> </File>
<File <File
RelativePath="..\Modules\functionalmodule.c"> RelativePath="..\Modules\_functoolsmodule.c">
</File>
<File
RelativePath="..\Modules\functionalmodule.c">
</File> </File>
<File <File
RelativePath="..\Python\future.c"> RelativePath="..\Python\future.c">
......
...@@ -377,8 +377,8 @@ class PyBuildExt(build_ext): ...@@ -377,8 +377,8 @@ class PyBuildExt(build_ext):
exts.append( Extension("_heapq", ["_heapqmodule.c"]) ) exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
# operator.add() and similar goodies # operator.add() and similar goodies
exts.append( Extension('operator', ['operator.c']) ) exts.append( Extension('operator', ['operator.c']) )
# functional # _functools
exts.append( Extension("functional", ["functionalmodule.c"]) ) exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
# Python C API test module # Python C API test module
exts.append( Extension('_testcapi', ['_testcapimodule.c']) ) exts.append( Extension('_testcapi', ['_testcapimodule.c']) )
# profilers (_lsprof is for cProfile.py) # profilers (_lsprof is for cProfile.py)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment