Kaydet (Commit) 22f18750 authored tarafından Victor Stinner's avatar Victor Stinner

Issue #20185: Convert _warnings.warn() to Argument Clinic

Fix warn_explicit(): interpret source=None as source=NULL.
üst 0ca246c5
#include "Python.h" #include "Python.h"
#include "frameobject.h" #include "frameobject.h"
#include "clinic/_warnings.c.h"
#define MODULE_NAME "_warnings" #define MODULE_NAME "_warnings"
...@@ -485,6 +486,10 @@ warn_explicit(PyObject *category, PyObject *message, ...@@ -485,6 +486,10 @@ warn_explicit(PyObject *category, PyObject *message,
if (lineno_obj == NULL) if (lineno_obj == NULL)
goto cleanup; goto cleanup;
if (source == Py_None) {
source = NULL;
}
/* Create key. */ /* Create key. */
key = PyTuple_Pack(3, text, category, lineno_obj); key = PyTuple_Pack(3, text, category, lineno_obj);
if (key == NULL) if (key == NULL)
...@@ -805,22 +810,26 @@ do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level, ...@@ -805,22 +810,26 @@ do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level,
return res; return res;
} }
static PyObject * /*[clinic input]
warnings_warn(PyObject *self, PyObject *args, PyObject *kwds) warn as warnings_warn
{
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: object
&message, &category, &stack_level, &source)) category: object = None
return NULL; 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_impl(PyObject *module, PyObject *message, PyObject *category,
Py_ssize_t stacklevel, PyObject *source)
/*[clinic end generated code: output=31ed5ab7d8d760b2 input=bfdf5cf99f6c4edd]*/
{
category = get_category(message, category); category = get_category(message, category);
if (category == NULL) if (category == NULL)
return NULL; return NULL;
return do_warn(message, category, stack_level, source); return do_warn(message, category, stacklevel, source);
} }
static PyObject * static PyObject *
...@@ -1098,15 +1107,11 @@ exit: ...@@ -1098,15 +1107,11 @@ exit:
} }
PyDoc_STRVAR(warn_doc,
"Issue a warning, or maybe ignore it or raise an exception.");
PyDoc_STRVAR(warn_explicit_doc, PyDoc_STRVAR(warn_explicit_doc,
"Low-level inferface to warnings functionality."); "Low-level inferface to warnings functionality.");
static PyMethodDef warnings_functions[] = { static PyMethodDef warnings_functions[] = {
{"warn", (PyCFunction)warnings_warn, METH_VARARGS | METH_KEYWORDS, WARNINGS_WARN_METHODDEF
warn_doc},
{"warn_explicit", (PyCFunction)warnings_warn_explicit, {"warn_explicit", (PyCFunction)warnings_warn_explicit,
METH_VARARGS | METH_KEYWORDS, warn_explicit_doc}, METH_VARARGS | METH_KEYWORDS, warn_explicit_doc},
{"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS, {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS,
......
/*[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]*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment