changeset: 105559:c62352ec21bc user: Victor Stinner date: Fri Dec 09 18:08:18 2016 +0100 files: Python/_warnings.c Python/clinic/_warnings.c.h description: Issue #20185: Convert _warnings.warn() to Argument Clinic Fix warn_explicit(): interpret source=None as source=NULL. diff -r 99c34e47348b -r c62352ec21bc Python/_warnings.c --- a/Python/_warnings.c Fri Dec 09 17:12:17 2016 +0100 +++ b/Python/_warnings.c Fri Dec 09 18:08:18 2016 +0100 @@ -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 -r 99c34e47348b -r c62352ec21bc Python/clinic/_warnings.c.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Python/clinic/_warnings.c.h Fri Dec 09 18:08:18 2016 +0100 @@ -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]*/