[Python-checkins] cpython: Issue #20185: Convert _warnings.warn() to Argument Clinic

victor.stinner python-checkins at python.org
Fri Dec 9 12:20:33 EST 2016


https://hg.python.org/cpython/rev/c62352ec21bc
changeset:   105559:c62352ec21bc
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Fri Dec 09 18:08:18 2016 +0100
summary:
  Issue #20185: Convert _warnings.warn() to Argument Clinic

Fix warn_explicit(): interpret source=None as source=NULL.

files:
  Python/_warnings.c          |  37 +++++++++++++----------
  Python/clinic/_warnings.c.h |  38 +++++++++++++++++++++++++
  2 files changed, 59 insertions(+), 16 deletions(-)


diff --git a/Python/_warnings.c b/Python/_warnings.c
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -1,5 +1,6 @@
 #include "Python.h"
 #include "frameobject.h"
+#include "clinic/_warnings.c.h"
 
 #define MODULE_NAME "_warnings"
 
@@ -485,6 +486,10 @@
     if (lineno_obj == NULL)
         goto cleanup;
 
+    if (source == Py_None) {
+        source = NULL;
+    }
+
     /* Create key. */
     key = PyTuple_Pack(3, text, category, lineno_obj);
     if (key == NULL)
@@ -805,22 +810,26 @@
     return res;
 }
 
+/*[clinic input]
+warn as warnings_warn
+
+    message: object
+    category: object = None
+    stacklevel: Py_ssize_t = 1
+    source: object = None
+
+Issue a warning, or maybe ignore it or raise an exception.
+[clinic start generated code]*/
+
 static PyObject *
-warnings_warn(PyObject *self, PyObject *args, PyObject *kwds)
+warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category,
+                   Py_ssize_t stacklevel, PyObject *source)
+/*[clinic end generated code: output=31ed5ab7d8d760b2 input=bfdf5cf99f6c4edd]*/
 {
-    static char *kw_list[] = {"message", "category", "stacklevel",
-                              "source", NULL};
-    PyObject *message, *category = NULL, *source = NULL;
-    Py_ssize_t stack_level = 1;
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OnO:warn", kw_list,
-                                     &message, &category, &stack_level, &source))
-        return NULL;
-
     category = get_category(message, category);
     if (category == NULL)
         return NULL;
-    return do_warn(message, category, stack_level, source);
+    return do_warn(message, category, stacklevel, source);
 }
 
 static PyObject *
@@ -1098,15 +1107,11 @@
 }
 
 
-PyDoc_STRVAR(warn_doc,
-"Issue a warning, or maybe ignore it or raise an exception.");
-
 PyDoc_STRVAR(warn_explicit_doc,
 "Low-level inferface to warnings functionality.");
 
 static PyMethodDef warnings_functions[] = {
-    {"warn", (PyCFunction)warnings_warn, METH_VARARGS | METH_KEYWORDS,
-        warn_doc},
+    WARNINGS_WARN_METHODDEF
     {"warn_explicit", (PyCFunction)warnings_warn_explicit,
         METH_VARARGS | METH_KEYWORDS, warn_explicit_doc},
     {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS,
diff --git a/Python/clinic/_warnings.c.h b/Python/clinic/_warnings.c.h
new file mode 100644
--- /dev/null
+++ b/Python/clinic/_warnings.c.h
@@ -0,0 +1,38 @@
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+PyDoc_STRVAR(warnings_warn__doc__,
+"warn($module, /, message, category=None, stacklevel=1, source=None)\n"
+"--\n"
+"\n"
+"Issue a warning, or maybe ignore it or raise an exception.");
+
+#define WARNINGS_WARN_METHODDEF    \
+    {"warn", (PyCFunction)warnings_warn, METH_FASTCALL, warnings_warn__doc__},
+
+static PyObject *
+warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category,
+                   Py_ssize_t stacklevel, PyObject *source);
+
+static PyObject *
+warnings_warn(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
+{
+    PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"message", "category", "stacklevel", "source", NULL};
+    static _PyArg_Parser _parser = {"O|OnO:warn", _keywords, 0};
+    PyObject *message;
+    PyObject *category = Py_None;
+    Py_ssize_t stacklevel = 1;
+    PyObject *source = Py_None;
+
+    if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser,
+        &message, &category, &stacklevel, &source)) {
+        goto exit;
+    }
+    return_value = warnings_warn_impl(module, message, category, stacklevel, source);
+
+exit:
+    return return_value;
+}
+/*[clinic end generated code: output=b3c5297c2c55778c input=a9049054013a1b77]*/

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list