Mercurial > cpython-lru_cache-weakref
annotate Modules/_functoolsmodule.c @ 58973:db86bf39ccaa legacy-trunk
Issue 7970: When email.Parser.Parser parses a MIME message of type
message/rfc822 it turns it into an object whose body consists of
a list containing a single Message object. HeaderParser, on the
other hand, just copies the body as a string. Generator.flatten
has a special handler for the message mime type that expected the
body to be the one item list. This fails if the message was parsed
by HeaderParser. So we now check to see if the body is a string
first, and if so just we just emit it.
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Sun, 21 Feb 2010 04:23:00 +0000 |
| parents | 184ca6293218 |
| children | fd25030223b0 |
| rev | line source |
|---|---|
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2 #include "Python.h" |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3 #include "structmember.h" |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4 |
|
38477
aa065f820252
Apply modified version of Collin Winter's patch #1478788
Nick Coghlan <ncoghlan@gmail.com>
parents:
37673
diff
changeset
|
5 /* _functools module written and maintained |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6 by Hye-Shik Chang <perky@FreeBSD.org> |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
7 with adaptations by Raymond Hettinger <python@rcn.com> |
|
38477
aa065f820252
Apply modified version of Collin Winter's patch #1478788
Nick Coghlan <ncoghlan@gmail.com>
parents:
37673
diff
changeset
|
8 Copyright (c) 2004, 2005, 2006 Python Software Foundation. |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
9 All rights reserved. |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
10 */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
11 |
|
48204
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
12 /* reduce() *************************************************************/ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
13 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
14 static PyObject * |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
15 functools_reduce(PyObject *self, PyObject *args) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
16 { |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
17 PyObject *seq, *func, *result = NULL, *it; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
18 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
19 if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result)) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
20 return NULL; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
21 if (result != NULL) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
22 Py_INCREF(result); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
23 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
24 it = PyObject_GetIter(seq); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
25 if (it == NULL) { |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
26 PyErr_SetString(PyExc_TypeError, |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
27 "reduce() arg 2 must support iteration"); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
28 Py_XDECREF(result); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
29 return NULL; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
30 } |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
31 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
32 if ((args = PyTuple_New(2)) == NULL) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
33 goto Fail; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
34 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
35 for (;;) { |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
36 PyObject *op2; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
37 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
38 if (args->ob_refcnt > 1) { |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
39 Py_DECREF(args); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
40 if ((args = PyTuple_New(2)) == NULL) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
41 goto Fail; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
42 } |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
43 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
44 op2 = PyIter_Next(it); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
45 if (op2 == NULL) { |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
46 if (PyErr_Occurred()) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
47 goto Fail; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
48 break; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
49 } |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
50 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
51 if (result == NULL) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
52 result = op2; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
53 else { |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
54 PyTuple_SetItem(args, 0, result); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
55 PyTuple_SetItem(args, 1, op2); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
56 if ((result = PyEval_CallObject(func, args)) == NULL) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
57 goto Fail; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
58 } |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
59 } |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
60 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
61 Py_DECREF(args); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
62 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
63 if (result == NULL) |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
64 PyErr_SetString(PyExc_TypeError, |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
65 "reduce() of empty sequence with no initial value"); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
66 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
67 Py_DECREF(it); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
68 return result; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
69 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
70 Fail: |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
71 Py_XDECREF(args); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
72 Py_XDECREF(result); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
73 Py_DECREF(it); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
74 return NULL; |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
75 } |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
76 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
77 PyDoc_STRVAR(reduce_doc, |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
78 "reduce(function, sequence[, initial]) -> value\n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
79 \n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
80 Apply a function of two arguments cumulatively to the items of a sequence,\n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
81 from left to right, so as to reduce the sequence to a single value.\n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
82 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
83 ((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
84 of the sequence in the calculation, and serves as a default when the\n\ |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
85 sequence is empty."); |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
86 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
87 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
88 |
|
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
89 |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
90 /* partial object **********************************************************/ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
91 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
92 typedef struct { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
93 PyObject_HEAD |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
94 PyObject *fn; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
95 PyObject *args; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
96 PyObject *kw; |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
97 PyObject *dict; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
98 PyObject *weakreflist; /* List of weak references */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
99 } partialobject; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
100 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
101 static PyTypeObject partial_type; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
102 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
103 static PyObject * |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
104 partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
105 { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
106 PyObject *func; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
107 partialobject *pto; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
108 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
109 if (PyTuple_GET_SIZE(args) < 1) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
110 PyErr_SetString(PyExc_TypeError, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
111 "type 'partial' takes at least one argument"); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
112 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
113 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
114 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
115 func = PyTuple_GET_ITEM(args, 0); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
116 if (!PyCallable_Check(func)) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
117 PyErr_SetString(PyExc_TypeError, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
118 "the first argument must be callable"); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
119 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
120 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
121 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
122 /* create partialobject structure */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
123 pto = (partialobject *)type->tp_alloc(type, 0); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
124 if (pto == NULL) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
125 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
126 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
127 pto->fn = func; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
128 Py_INCREF(func); |
|
37673
606818c33e50
Replace INT_MAX with PY_SSIZE_T_MAX.
Martin v. Löwis <martin@v.loewis.de>
parents:
36635
diff
changeset
|
129 pto->args = PyTuple_GetSlice(args, 1, PY_SSIZE_T_MAX); |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
130 if (pto->args == NULL) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
131 pto->kw = NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
132 Py_DECREF(pto); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
133 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
134 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
135 if (kw != NULL) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
136 pto->kw = PyDict_Copy(kw); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
137 if (pto->kw == NULL) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
138 Py_DECREF(pto); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
139 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
140 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
141 } else { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
142 pto->kw = Py_None; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
143 Py_INCREF(Py_None); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
144 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
145 |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
146 pto->weakreflist = NULL; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
147 pto->dict = NULL; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
148 |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
149 return (PyObject *)pto; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
150 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
151 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
152 static void |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
153 partial_dealloc(partialobject *pto) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
154 { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
155 PyObject_GC_UnTrack(pto); |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
156 if (pto->weakreflist != NULL) |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
157 PyObject_ClearWeakRefs((PyObject *) pto); |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
158 Py_XDECREF(pto->fn); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
159 Py_XDECREF(pto->args); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
160 Py_XDECREF(pto->kw); |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
161 Py_XDECREF(pto->dict); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
162 Py_TYPE(pto)->tp_free(pto); |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
163 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
164 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
165 static PyObject * |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
166 partial_call(partialobject *pto, PyObject *args, PyObject *kw) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
167 { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
168 PyObject *ret; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
169 PyObject *argappl = NULL, *kwappl = NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
170 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
171 assert (PyCallable_Check(pto->fn)); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
172 assert (PyTuple_Check(pto->args)); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
173 assert (pto->kw == Py_None || PyDict_Check(pto->kw)); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
174 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
175 if (PyTuple_GET_SIZE(pto->args) == 0) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
176 argappl = args; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
177 Py_INCREF(args); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
178 } else if (PyTuple_GET_SIZE(args) == 0) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
179 argappl = pto->args; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
180 Py_INCREF(pto->args); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
181 } else { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
182 argappl = PySequence_Concat(pto->args, args); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
183 if (argappl == NULL) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
184 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
185 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
186 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
187 if (pto->kw == Py_None) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
188 kwappl = kw; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
189 Py_XINCREF(kw); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
190 } else { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
191 kwappl = PyDict_Copy(pto->kw); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
192 if (kwappl == NULL) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
193 Py_DECREF(argappl); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
194 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
195 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
196 if (kw != NULL) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
197 if (PyDict_Merge(kwappl, kw, 1) != 0) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
198 Py_DECREF(argappl); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
199 Py_DECREF(kwappl); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
200 return NULL; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
201 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
202 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
203 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
204 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
205 ret = PyObject_Call(pto->fn, argappl, kwappl); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
206 Py_DECREF(argappl); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
207 Py_XDECREF(kwappl); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
208 return ret; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
209 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
210 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
211 static int |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
212 partial_traverse(partialobject *pto, visitproc visit, void *arg) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
213 { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
214 Py_VISIT(pto->fn); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
215 Py_VISIT(pto->args); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
216 Py_VISIT(pto->kw); |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
217 Py_VISIT(pto->dict); |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
218 return 0; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
219 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
220 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
221 PyDoc_STRVAR(partial_doc, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
222 "partial(func, *args, **keywords) - new function with partial application\n\ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
223 of the given arguments and keywords.\n"); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
224 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
225 #define OFF(x) offsetof(partialobject, x) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
226 static PyMemberDef partial_memberlist[] = { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
227 {"func", T_OBJECT, OFF(fn), READONLY, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
228 "function object to use in future partial calls"}, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
229 {"args", T_OBJECT, OFF(args), READONLY, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
230 "tuple of arguments to future partial calls"}, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
231 {"keywords", T_OBJECT, OFF(kw), READONLY, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
232 "dictionary of keyword arguments to future partial calls"}, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
233 {NULL} /* Sentinel */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
234 }; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
235 |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
236 static PyObject * |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
237 partial_get_dict(partialobject *pto) |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
238 { |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
239 if (pto->dict == NULL) { |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
240 pto->dict = PyDict_New(); |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
241 if (pto->dict == NULL) |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
242 return NULL; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
243 } |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
244 Py_INCREF(pto->dict); |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
245 return pto->dict; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
246 } |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
247 |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
248 static int |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
249 partial_set_dict(partialobject *pto, PyObject *value) |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
250 { |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
251 PyObject *tmp; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
252 |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
253 /* It is illegal to del p.__dict__ */ |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
254 if (value == NULL) { |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
255 PyErr_SetString(PyExc_TypeError, |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
256 "a partial object's dictionary may not be deleted"); |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
257 return -1; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
258 } |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
259 /* Can only set __dict__ to a dictionary */ |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
260 if (!PyDict_Check(value)) { |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
261 PyErr_SetString(PyExc_TypeError, |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
262 "setting partial object's dictionary to a non-dict"); |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
263 return -1; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
264 } |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
265 tmp = pto->dict; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
266 Py_INCREF(value); |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
267 pto->dict = value; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
268 Py_XDECREF(tmp); |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
269 return 0; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
270 } |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
271 |
|
36635
145d5fc9a6a5
Fix typo in functional module
Georg Brandl <georg@python.org>
parents:
36324
diff
changeset
|
272 static PyGetSetDef partial_getsetlist[] = { |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
273 {"__dict__", (getter)partial_get_dict, (setter)partial_set_dict}, |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
274 {NULL} /* Sentinel */ |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
275 }; |
|
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
276 |
|
52627
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
277 /* Pickle strategy: |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
278 __reduce__ by itself doesn't support getting kwargs in the unpickle |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
279 operation so we define a __setstate__ that replaces all the information |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
280 about the partial. If we only replaced part of it someone would use |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
281 it as a hook to do stange things. |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
282 */ |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
283 |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
284 PyObject * |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
285 partial_reduce(partialobject *pto, PyObject *unused) |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
286 { |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
287 return Py_BuildValue("O(O)(OOOO)", Py_TYPE(pto), pto->fn, pto->fn, |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
288 pto->args, pto->kw, |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
289 pto->dict ? pto->dict : Py_None); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
290 } |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
291 |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
292 PyObject * |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
293 partial_setstate(partialobject *pto, PyObject *args) |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
294 { |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
295 PyObject *fn, *fnargs, *kw, *dict; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
296 if (!PyArg_ParseTuple(args, "(OOOO):__setstate__", |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
297 &fn, &fnargs, &kw, &dict)) |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
298 return NULL; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
299 Py_XDECREF(pto->fn); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
300 Py_XDECREF(pto->args); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
301 Py_XDECREF(pto->kw); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
302 Py_XDECREF(pto->dict); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
303 pto->fn = fn; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
304 pto->args = fnargs; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
305 pto->kw = kw; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
306 if (dict != Py_None) { |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
307 pto->dict = dict; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
308 Py_INCREF(dict); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
309 } else { |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
310 pto->dict = NULL; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
311 } |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
312 Py_INCREF(fn); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
313 Py_INCREF(fnargs); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
314 Py_INCREF(kw); |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
315 Py_RETURN_NONE; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
316 } |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
317 |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
318 static PyMethodDef partial_methods[] = { |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
319 {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS}, |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
320 {"__setstate__", (PyCFunction)partial_setstate, METH_VARARGS}, |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
321 {NULL, NULL} /* sentinel */ |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
322 }; |
|
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
323 |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
324 static PyTypeObject partial_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
38477
diff
changeset
|
325 PyVarObject_HEAD_INIT(NULL, 0) |
|
38477
aa065f820252
Apply modified version of Collin Winter's patch #1478788
Nick Coghlan <ncoghlan@gmail.com>
parents:
37673
diff
changeset
|
326 "functools.partial", /* tp_name */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
327 sizeof(partialobject), /* tp_basicsize */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
328 0, /* tp_itemsize */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
329 /* methods */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
330 (destructor)partial_dealloc, /* tp_dealloc */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
331 0, /* tp_print */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
332 0, /* tp_getattr */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
333 0, /* tp_setattr */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
334 0, /* tp_compare */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
335 0, /* tp_repr */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
336 0, /* tp_as_number */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
337 0, /* tp_as_sequence */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
338 0, /* tp_as_mapping */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
339 0, /* tp_hash */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
340 (ternaryfunc)partial_call, /* tp_call */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
341 0, /* tp_str */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
342 PyObject_GenericGetAttr, /* tp_getattro */ |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
343 PyObject_GenericSetAttr, /* tp_setattro */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
344 0, /* tp_as_buffer */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
345 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
346 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
347 partial_doc, /* tp_doc */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
348 (traverseproc)partial_traverse, /* tp_traverse */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
349 0, /* tp_clear */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
350 0, /* tp_richcompare */ |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
351 offsetof(partialobject, weakreflist), /* tp_weaklistoffset */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
352 0, /* tp_iter */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
353 0, /* tp_iternext */ |
|
52627
184ca6293218
#5228: add pickle support to functools.partial
Jack Diederich <jackdied@gmail.com>
parents:
48204
diff
changeset
|
354 partial_methods, /* tp_methods */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
355 partial_memberlist, /* tp_members */ |
|
36635
145d5fc9a6a5
Fix typo in functional module
Georg Brandl <georg@python.org>
parents:
36324
diff
changeset
|
356 partial_getsetlist, /* tp_getset */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
357 0, /* tp_base */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
358 0, /* tp_dict */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
359 0, /* tp_descr_get */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
360 0, /* tp_descr_set */ |
|
34703
7de76f34b3da
Make functional.partial() more closely match the spec by emulating
Raymond Hettinger <python@rcn.com>
parents:
34636
diff
changeset
|
361 offsetof(partialobject, dict), /* tp_dictoffset */ |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
362 0, /* tp_init */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
363 0, /* tp_alloc */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
364 partial_new, /* tp_new */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
365 PyObject_GC_Del, /* tp_free */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
366 }; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
367 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
368 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
369 /* module level code ********************************************************/ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
370 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
371 PyDoc_STRVAR(module_doc, |
|
38477
aa065f820252
Apply modified version of Collin Winter's patch #1478788
Nick Coghlan <ncoghlan@gmail.com>
parents:
37673
diff
changeset
|
372 "Tools that operate on functions."); |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
373 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
374 static PyMethodDef module_methods[] = { |
|
48204
b3abff17e2dd
Copy reduce() to _functools so to have functools.reduce() not raise a warning
Brett Cannon <bcannon@gmail.com>
parents:
44350
diff
changeset
|
375 {"reduce", functools_reduce, METH_VARARGS, reduce_doc}, |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
376 {NULL, NULL} /* sentinel */ |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
377 }; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
378 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
379 PyMODINIT_FUNC |
|
38477
aa065f820252
Apply modified version of Collin Winter's patch #1478788
Nick Coghlan <ncoghlan@gmail.com>
parents:
37673
diff
changeset
|
380 init_functools(void) |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
381 { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
382 int i; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
383 PyObject *m; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
384 char *name; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
385 PyTypeObject *typelist[] = { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
386 &partial_type, |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
387 NULL |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
388 }; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
389 |
|
38477
aa065f820252
Apply modified version of Collin Winter's patch #1478788
Nick Coghlan <ncoghlan@gmail.com>
parents:
37673
diff
changeset
|
390 m = Py_InitModule3("_functools", module_methods, module_doc); |
|
36324
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
34703
diff
changeset
|
391 if (m == NULL) |
|
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
34703
diff
changeset
|
392 return; |
|
34636
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
393 |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
394 for (i=0 ; typelist[i] != NULL ; i++) { |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
395 if (PyType_Ready(typelist[i]) < 0) |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
396 return; |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
397 name = strchr(typelist[i]->tp_name, '.'); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
398 assert (name != NULL); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
399 Py_INCREF(typelist[i]); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
400 PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
401 } |
|
3d0bb3b05d39
SF patch #941881: PEP 309 Implementation (Partial Function Application).
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
402 } |
