Mercurial > cpython-lru_cache-weakref
annotate Modules/_functoolsmodule.c @ 73323:dad02a080bbc
Improve byte-compilation in packaging to be independent of -O or -B.
The code I fixed to comply with PEP 3147 still had one bug: When run
under python -O, some paths for pyc files would be pyo, because I called
imp.cache_from_source without explicit debug_override argument in some
places, and under -O that would return .pyo (this is well explained in
the imp docs). Now all code (util.byte_compile, build_py, install_lib)
can create .pyo files according to options given by users,
without interference from the calling Python’s own optimize mode.
On a related topic, I also removed the code that prevented byte
compilation under python -B. The rationale is that packaging gives
control over the creation of pyc files to the user with its own explicit
option, and the behavior should not be changed if the calling Python
happens to run with -B for whatever reason. I will argue that this is a
bug fix and ask to be allowed to backport this change to distutils.
Finally, I moved one nugget of information about the --compile and
--optimize options from the source into the doc. It clears up a
misunderstanding that I (and maybe other people) had.
| author | Éric Araujo <merwok@netwok.org> |
|---|---|
| date | Thu, 03 Nov 2011 05:08:28 +0100 |
| parents | a593a1030f2c |
| children | f029312764b4 |
| rev | line source |
|---|---|
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
1 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
2 #include "Python.h" |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
3 #include "structmember.h" |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
4 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
5 /* _functools module written and maintained |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
6 by Hye-Shik Chang <perky@FreeBSD.org> |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
7 with adaptations by Raymond Hettinger <python@rcn.com> |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
8 Copyright (c) 2004, 2005, 2006 Python Software Foundation. |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
9 All rights reserved. |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
10 */ |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
11 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
12 /* partial object **********************************************************/ |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
13 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
14 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
15 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
16 PyObject *fn; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
17 PyObject *args; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
18 PyObject *kw; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
19 PyObject *dict; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
20 PyObject *weakreflist; /* List of weak references */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
21 } partialobject; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
22 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
23 static PyTypeObject partial_type; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
24 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
25 static PyObject * |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
26 partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
27 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
28 PyObject *func; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
29 partialobject *pto; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
30 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
31 if (PyTuple_GET_SIZE(args) < 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
32 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
33 "type 'partial' takes at least one argument"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
34 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
35 } |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
36 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
37 func = PyTuple_GET_ITEM(args, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
38 if (!PyCallable_Check(func)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
39 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
40 "the first argument must be callable"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
41 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
42 } |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
43 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
44 /* create partialobject structure */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
45 pto = (partialobject *)type->tp_alloc(type, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
46 if (pto == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
47 return NULL; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
48 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
49 pto->fn = func; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
50 Py_INCREF(func); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
51 pto->args = PyTuple_GetSlice(args, 1, PY_SSIZE_T_MAX); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
52 if (pto->args == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
53 pto->kw = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
54 Py_DECREF(pto); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
55 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
56 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
57 if (kw != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
58 pto->kw = PyDict_Copy(kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
59 if (pto->kw == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
60 Py_DECREF(pto); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
61 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
62 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
63 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
64 pto->kw = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
65 Py_INCREF(Py_None); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
66 } |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
67 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
68 pto->weakreflist = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
69 pto->dict = NULL; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
70 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
71 return (PyObject *)pto; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
72 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
73 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
74 static void |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
75 partial_dealloc(partialobject *pto) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
76 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
77 PyObject_GC_UnTrack(pto); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
78 if (pto->weakreflist != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
79 PyObject_ClearWeakRefs((PyObject *) pto); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
80 Py_XDECREF(pto->fn); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
81 Py_XDECREF(pto->args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
82 Py_XDECREF(pto->kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
83 Py_XDECREF(pto->dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
84 Py_TYPE(pto)->tp_free(pto); |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
85 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
86 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
87 static PyObject * |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
88 partial_call(partialobject *pto, PyObject *args, PyObject *kw) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
89 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
90 PyObject *ret; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
91 PyObject *argappl = NULL, *kwappl = NULL; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
92 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
93 assert (PyCallable_Check(pto->fn)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
94 assert (PyTuple_Check(pto->args)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
95 assert (pto->kw == Py_None || PyDict_Check(pto->kw)); |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
96 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
97 if (PyTuple_GET_SIZE(pto->args) == 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
98 argappl = args; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
99 Py_INCREF(args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
100 } else if (PyTuple_GET_SIZE(args) == 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
101 argappl = pto->args; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
102 Py_INCREF(pto->args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
103 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
104 argappl = PySequence_Concat(pto->args, args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
105 if (argappl == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
106 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
107 } |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
108 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
109 if (pto->kw == Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
110 kwappl = kw; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
111 Py_XINCREF(kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
112 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
113 kwappl = PyDict_Copy(pto->kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
114 if (kwappl == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
115 Py_DECREF(argappl); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
116 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
117 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
118 if (kw != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
119 if (PyDict_Merge(kwappl, kw, 1) != 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
120 Py_DECREF(argappl); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
121 Py_DECREF(kwappl); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
122 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
123 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
124 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
125 } |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
126 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
127 ret = PyObject_Call(pto->fn, argappl, kwappl); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
128 Py_DECREF(argappl); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
129 Py_XDECREF(kwappl); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
130 return ret; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
131 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
132 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
133 static int |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
134 partial_traverse(partialobject *pto, visitproc visit, void *arg) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
135 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
136 Py_VISIT(pto->fn); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
137 Py_VISIT(pto->args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
138 Py_VISIT(pto->kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
139 Py_VISIT(pto->dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
140 return 0; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
141 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
142 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
143 PyDoc_STRVAR(partial_doc, |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
144 "partial(func, *args, **keywords) - new function with partial application\n\ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
145 of the given arguments and keywords.\n"); |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
146 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
147 #define OFF(x) offsetof(partialobject, x) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
148 static PyMemberDef partial_memberlist[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
149 {"func", T_OBJECT, OFF(fn), READONLY, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
150 "function object to use in future partial calls"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
151 {"args", T_OBJECT, OFF(args), READONLY, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
152 "tuple of arguments to future partial calls"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
153 {"keywords", T_OBJECT, OFF(kw), READONLY, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
154 "dictionary of keyword arguments to future partial calls"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
155 {NULL} /* Sentinel */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
156 }; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
157 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
158 static PyObject * |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
159 partial_get_dict(partialobject *pto) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
160 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
161 if (pto->dict == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
162 pto->dict = PyDict_New(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
163 if (pto->dict == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
164 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
165 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
166 Py_INCREF(pto->dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
167 return pto->dict; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
168 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
169 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
170 static int |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
171 partial_set_dict(partialobject *pto, PyObject *value) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
172 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
173 PyObject *tmp; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
174 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
175 /* It is illegal to del p.__dict__ */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
176 if (value == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
177 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
178 "a partial object's dictionary may not be deleted"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
179 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
180 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
181 /* Can only set __dict__ to a dictionary */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
182 if (!PyDict_Check(value)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
183 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
184 "setting partial object's dictionary to a non-dict"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
185 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
186 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
187 tmp = pto->dict; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
188 Py_INCREF(value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
189 pto->dict = value; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
190 Py_XDECREF(tmp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
191 return 0; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
192 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
193 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
194 static PyGetSetDef partial_getsetlist[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
195 {"__dict__", (getter)partial_get_dict, (setter)partial_set_dict}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
196 {NULL} /* Sentinel */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
197 }; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
198 |
|
66587
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
199 static PyObject * |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
200 partial_repr(partialobject *pto) |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
201 { |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
202 PyObject *result; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
203 PyObject *arglist; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
204 PyObject *tmp; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
205 Py_ssize_t i, n; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
206 |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
207 arglist = PyUnicode_FromString(""); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
208 if (arglist == NULL) { |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
209 return NULL; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
210 } |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
211 /* Pack positional arguments */ |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
212 assert (PyTuple_Check(pto->args)); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
213 n = PyTuple_GET_SIZE(pto->args); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
214 for (i = 0; i < n; i++) { |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
215 tmp = PyUnicode_FromFormat("%U, %R", arglist, |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
216 PyTuple_GET_ITEM(pto->args, i)); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
217 Py_DECREF(arglist); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
218 if (tmp == NULL) |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
219 return NULL; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
220 arglist = tmp; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
221 } |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
222 /* Pack keyword arguments */ |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
223 assert (pto->kw == Py_None || PyDict_Check(pto->kw)); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
224 if (pto->kw != Py_None) { |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
225 PyObject *key, *value; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
226 for (i = 0; PyDict_Next(pto->kw, &i, &key, &value);) { |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
227 tmp = PyUnicode_FromFormat("%U, %U=%R", arglist, |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
228 key, value); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
229 Py_DECREF(arglist); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
230 if (tmp == NULL) |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
231 return NULL; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
232 arglist = tmp; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
233 } |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
234 } |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
235 result = PyUnicode_FromFormat("%s(%R%U)", Py_TYPE(pto)->tp_name, |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
236 pto->fn, arglist); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
237 Py_DECREF(arglist); |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
238 return result; |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
239 } |
|
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
240 |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
241 /* Pickle strategy: |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
242 __reduce__ by itself doesn't support getting kwargs in the unpickle |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
243 operation so we define a __setstate__ that replaces all the information |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
244 about the partial. If we only replaced part of it someone would use |
|
68585
bf94b6a73fc8
#11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
64068
diff
changeset
|
245 it as a hook to do strange things. |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
246 */ |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
247 |
|
54320
565413ee9c1b
Make some private functions static (thanks `make smelly`)
Antoine Pitrou <solipsis@pitrou.net>
parents:
52637
diff
changeset
|
248 static PyObject * |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
249 partial_reduce(partialobject *pto, PyObject *unused) |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
250 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
251 return Py_BuildValue("O(O)(OOOO)", Py_TYPE(pto), pto->fn, pto->fn, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
252 pto->args, pto->kw, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
253 pto->dict ? pto->dict : Py_None); |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
254 } |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
255 |
|
54320
565413ee9c1b
Make some private functions static (thanks `make smelly`)
Antoine Pitrou <solipsis@pitrou.net>
parents:
52637
diff
changeset
|
256 static PyObject * |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
257 partial_setstate(partialobject *pto, PyObject *args) |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
258 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
259 PyObject *fn, *fnargs, *kw, *dict; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
260 if (!PyArg_ParseTuple(args, "(OOOO):__setstate__", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
261 &fn, &fnargs, &kw, &dict)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
262 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
263 Py_XDECREF(pto->fn); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
264 Py_XDECREF(pto->args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
265 Py_XDECREF(pto->kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
266 Py_XDECREF(pto->dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
267 pto->fn = fn; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
268 pto->args = fnargs; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
269 pto->kw = kw; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
270 if (dict != Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
271 pto->dict = dict; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
272 Py_INCREF(dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
273 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
274 pto->dict = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
275 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
276 Py_INCREF(fn); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
277 Py_INCREF(fnargs); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
278 Py_INCREF(kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
279 Py_RETURN_NONE; |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
280 } |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
281 |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
282 static PyMethodDef partial_methods[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
283 {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
284 {"__setstate__", (PyCFunction)partial_setstate, METH_VARARGS}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
285 {NULL, NULL} /* sentinel */ |
|
52637
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
286 }; |
|
ffa81bd2ec72
Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents:
51271
diff
changeset
|
287 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
288 static PyTypeObject partial_type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
289 PyVarObject_HEAD_INIT(NULL, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
290 "functools.partial", /* tp_name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
291 sizeof(partialobject), /* tp_basicsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
292 0, /* tp_itemsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
293 /* methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
294 (destructor)partial_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
295 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
296 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
297 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
298 0, /* tp_reserved */ |
|
66587
2baad8bd0b4f
Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
64068
diff
changeset
|
299 (reprfunc)partial_repr, /* tp_repr */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
300 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
301 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
302 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
303 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
304 (ternaryfunc)partial_call, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
305 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
306 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
307 PyObject_GenericSetAttr, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
308 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
309 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
310 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
311 partial_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
312 (traverseproc)partial_traverse, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
313 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
314 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
315 offsetof(partialobject, weakreflist), /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
316 0, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
317 0, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
318 partial_methods, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
319 partial_memberlist, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
320 partial_getsetlist, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
321 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
322 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
323 0, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
324 0, /* tp_descr_set */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
325 offsetof(partialobject, dict), /* tp_dictoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
326 0, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
327 0, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
328 partial_new, /* tp_new */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
329 PyObject_GC_Del, /* tp_free */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
330 }; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
331 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
332 |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
333 /* cmp_to_key ***************************************************************/ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
334 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
335 typedef struct { |
|
69151
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
336 PyObject_HEAD |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
337 PyObject *cmp; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
338 PyObject *object; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
339 } keyobject; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
340 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
341 static void |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
342 keyobject_dealloc(keyobject *ko) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
343 { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
344 Py_DECREF(ko->cmp); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
345 Py_XDECREF(ko->object); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
346 PyObject_FREE(ko); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
347 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
348 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
349 static int |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
350 keyobject_traverse(keyobject *ko, visitproc visit, void *arg) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
351 { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
352 Py_VISIT(ko->cmp); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
353 if (ko->object) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
354 Py_VISIT(ko->object); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
355 return 0; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
356 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
357 |
|
69161
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
358 static int |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
359 keyobject_clear(keyobject *ko) |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
360 { |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
361 Py_CLEAR(ko->cmp); |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
362 if (ko->object) |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
363 Py_CLEAR(ko->object); |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
364 return 0; |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
365 } |
|
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
366 |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
367 static PyMemberDef keyobject_members[] = { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
368 {"obj", T_OBJECT, |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
369 offsetof(keyobject, object), 0, |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
370 PyDoc_STR("Value wrapped by a key function.")}, |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
371 {NULL} |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
372 }; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
373 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
374 static PyObject * |
|
69222
a593a1030f2c
Fix nit (make spelling consistent in prototype)
Raymond Hettinger <python@rcn.com>
parents:
69161
diff
changeset
|
375 keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds); |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
376 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
377 static PyObject * |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
378 keyobject_richcompare(PyObject *ko, PyObject *other, int op); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
379 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
380 static PyTypeObject keyobject_type = { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
381 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
382 "functools.KeyWrapper", /* tp_name */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
383 sizeof(keyobject), /* tp_basicsize */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
384 0, /* tp_itemsize */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
385 /* methods */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
386 (destructor)keyobject_dealloc, /* tp_dealloc */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
387 0, /* tp_print */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
388 0, /* tp_getattr */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
389 0, /* tp_setattr */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
390 0, /* tp_reserved */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
391 0, /* tp_repr */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
392 0, /* tp_as_number */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
393 0, /* tp_as_sequence */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
394 0, /* tp_as_mapping */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
395 0, /* tp_hash */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
396 (ternaryfunc)keyobject_call, /* tp_call */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
397 0, /* tp_str */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
398 PyObject_GenericGetAttr, /* tp_getattro */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
399 0, /* tp_setattro */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
400 0, /* tp_as_buffer */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
401 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
402 0, /* tp_doc */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
403 (traverseproc)keyobject_traverse, /* tp_traverse */ |
|
69161
7b5d09343929
implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents:
69151
diff
changeset
|
404 (inquiry)keyobject_clear, /* tp_clear */ |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
405 keyobject_richcompare, /* tp_richcompare */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
406 0, /* tp_weaklistoffset */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
407 0, /* tp_iter */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
408 0, /* tp_iternext */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
409 0, /* tp_methods */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
410 keyobject_members, /* tp_members */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
411 0, /* tp_getset */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
412 }; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
413 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
414 static PyObject * |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
415 keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
416 { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
417 PyObject *object; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
418 keyobject *result; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
419 static char *kwargs[] = {"obj", NULL}; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
420 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
421 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:K", kwargs, &object)) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
422 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
423 result = PyObject_New(keyobject, &keyobject_type); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
424 if (!result) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
425 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
426 Py_INCREF(ko->cmp); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
427 result->cmp = ko->cmp; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
428 Py_INCREF(object); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
429 result->object = object; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
430 return (PyObject *)result; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
431 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
432 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
433 static PyObject * |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
434 keyobject_richcompare(PyObject *ko, PyObject *other, int op) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
435 { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
436 PyObject *res; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
437 PyObject *args; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
438 PyObject *x; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
439 PyObject *y; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
440 PyObject *compare; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
441 PyObject *answer; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
442 static PyObject *zero; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
443 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
444 if (zero == NULL) { |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
445 zero = PyLong_FromLong(0); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
446 if (!zero) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
447 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
448 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
449 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
450 if (Py_TYPE(other) != &keyobject_type){ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
451 PyErr_Format(PyExc_TypeError, "other argument must be K instance"); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
452 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
453 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
454 compare = ((keyobject *) ko)->cmp; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
455 assert(compare != NULL); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
456 x = ((keyobject *) ko)->object; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
457 y = ((keyobject *) other)->object; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
458 if (!x || !y){ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
459 PyErr_Format(PyExc_AttributeError, "object"); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
460 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
461 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
462 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
463 /* Call the user's comparison function and translate the 3-way |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
464 * result into true or false (or error). |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
465 */ |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
466 args = PyTuple_New(2); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
467 if (args == NULL) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
468 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
469 Py_INCREF(x); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
470 Py_INCREF(y); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
471 PyTuple_SET_ITEM(args, 0, x); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
472 PyTuple_SET_ITEM(args, 1, y); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
473 res = PyObject_Call(compare, args, NULL); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
474 Py_DECREF(args); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
475 if (res == NULL) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
476 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
477 answer = PyObject_RichCompare(res, zero, op); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
478 Py_DECREF(res); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
479 return answer; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
480 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
481 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
482 static PyObject * |
|
69151
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
483 functools_cmp_to_key(PyObject *self, PyObject *args, PyObject *kwds) |
|
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
484 { |
|
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
485 PyObject *cmp; |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
486 static char *kwargs[] = {"mycmp", NULL}; |
|
69151
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
487 keyobject *object; |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
488 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
489 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:cmp_to_key", kwargs, &cmp)) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
490 return NULL; |
|
69151
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
491 object = PyObject_New(keyobject, &keyobject_type); |
|
69150
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
492 if (!object) |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
493 return NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
494 Py_INCREF(cmp); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
495 object->cmp = cmp; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
496 object->object = NULL; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
497 return (PyObject *)object; |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
498 } |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
499 |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
500 PyDoc_STRVAR(functools_cmp_to_key_doc, |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
501 "Convert a cmp= function into a key= function."); |
|
a03fb2fc3ed8
Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents:
68586
diff
changeset
|
502 |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
503 /* reduce (used to be a builtin) ********************************************/ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
504 |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
505 static PyObject * |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
506 functools_reduce(PyObject *self, PyObject *args) |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
507 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
508 PyObject *seq, *func, *result = NULL, *it; |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
509 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
510 if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
511 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
512 if (result != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
513 Py_INCREF(result); |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
514 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
515 it = PyObject_GetIter(seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
516 if (it == NULL) { |
|
64068
715c44b60ef3
Issue #665761: functools.reduce() will no longer mask exceptions other
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
61466
diff
changeset
|
517 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
715c44b60ef3
Issue #665761: functools.reduce() will no longer mask exceptions other
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
61466
diff
changeset
|
518 PyErr_SetString(PyExc_TypeError, |
|
715c44b60ef3
Issue #665761: functools.reduce() will no longer mask exceptions other
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
61466
diff
changeset
|
519 "reduce() arg 2 must support iteration"); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
520 Py_XDECREF(result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
521 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
522 } |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
523 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
524 if ((args = PyTuple_New(2)) == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
525 goto Fail; |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
526 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
527 for (;;) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
528 PyObject *op2; |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
529 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
530 if (args->ob_refcnt > 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
531 Py_DECREF(args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
532 if ((args = PyTuple_New(2)) == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
533 goto Fail; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
534 } |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
535 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
536 op2 = PyIter_Next(it); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
537 if (op2 == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
538 if (PyErr_Occurred()) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
539 goto Fail; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
540 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
541 } |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
542 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
543 if (result == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
544 result = op2; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
545 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
546 PyTuple_SetItem(args, 0, result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
547 PyTuple_SetItem(args, 1, op2); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
548 if ((result = PyEval_CallObject(func, args)) == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
549 goto Fail; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
550 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
551 } |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
552 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
553 Py_DECREF(args); |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
554 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
555 if (result == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
556 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
557 "reduce() of empty sequence with no initial value"); |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
558 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
559 Py_DECREF(it); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
560 return result; |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
561 |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
562 Fail: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
563 Py_XDECREF(args); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
564 Py_XDECREF(result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
565 Py_DECREF(it); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
566 return NULL; |
|
39691
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
567 } |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
568 |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
569 PyDoc_STRVAR(functools_reduce_doc, |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
570 "reduce(function, sequence[, initial]) -> value\n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
571 \n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
572 Apply a function of two arguments cumulatively to the items of a sequence,\n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
573 from left to right, so as to reduce the sequence to a single value.\n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
574 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
575 ((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
576 of the sequence in the calculation, and serves as a default when the\n\ |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
577 sequence is empty."); |
|
c4d8c054616c
Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents:
39222
diff
changeset
|
578 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
579 /* module level code ********************************************************/ |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
580 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
581 PyDoc_STRVAR(module_doc, |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
582 "Tools that operate on functions."); |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
583 |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
584 static PyMethodDef module_methods[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
585 {"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc}, |
|
69151
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
586 {"cmp_to_key", (PyCFunction)functools_cmp_to_key, |
|
76ed6a061ebe
Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69150
diff
changeset
|
587 METH_VARARGS | METH_KEYWORDS, functools_cmp_to_key_doc}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
588 {NULL, NULL} /* sentinel */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
589 }; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
590 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
591 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
592 static struct PyModuleDef _functoolsmodule = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
593 PyModuleDef_HEAD_INIT, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
594 "_functools", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
595 module_doc, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
596 -1, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
597 module_methods, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
598 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
599 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
600 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
601 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
602 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
603 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
604 PyMODINIT_FUNC |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
605 PyInit__functools(void) |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
606 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
607 int i; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
608 PyObject *m; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
609 char *name; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
610 PyTypeObject *typelist[] = { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
611 &partial_type, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
612 NULL |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
613 }; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
614 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
615 m = PyModule_Create(&_functoolsmodule); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
616 if (m == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
617 return NULL; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
618 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
619 for (i=0 ; typelist[i] != NULL ; i++) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
620 if (PyType_Ready(typelist[i]) < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
621 Py_DECREF(m); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
622 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
623 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
624 name = strchr(typelist[i]->tp_name, '.'); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
625 assert (name != NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
626 Py_INCREF(typelist[i]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
627 PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
628 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54320
diff
changeset
|
629 return m; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
630 } |
