diff options
author | Shantanu <12621235+hauntsaninja@users.noreply.github.com> | 2022-04-16 17:34:23 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-16 17:34:23 (GMT) |
commit | 1adc837bf1d88a110e1d9e3021abc92b7e7dfa8e (patch) | |
tree | a2e11b27e8428e9176b39740c916002ae1fb6539 | |
parent | 055760ed9e745a3104acbfa8a3b76eb26a72590d (diff) | |
download | cpython-1adc837bf1d88a110e1d9e3021abc92b7e7dfa8e.zip cpython-1adc837bf1d88a110e1d9e3021abc92b7e7dfa8e.tar.gz cpython-1adc837bf1d88a110e1d9e3021abc92b7e7dfa8e.tar.bz2 |
bpo-40676: Use Argument Clinic for csv (where possible) (GH-20200)
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst | 3 | ||||
-rw-r--r-- | Modules/_csv.c | 100 | ||||
-rw-r--r-- | Modules/clinic/_csv.c.h | 134 |
3 files changed, 200 insertions, 37 deletions
diff --git a/Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst b/Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst new file mode 100644 index 0000000..c67d4dc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst @@ -0,0 +1,3 @@ +Convert :mod:`csv` to use Argument Clinic for :func:`csv.field_size_limit`, +:func:`csv.get_dialect`, :func:`csv.unregister_dialect` and :func:`csv.list_dialects`. + diff --git a/Modules/_csv.c b/Modules/_csv.c index 991b623..4d68df5 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -14,6 +14,12 @@ module instead. #include "structmember.h" // PyMemberDef #include <stdbool.h> +/*[clinic input] +module _csv +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=385118b71aa43706]*/ + +#include "clinic/_csv.c.h" #define NOT_SET ((Py_UCS4)-1) #define EOL ((Py_UCS4)-2) @@ -1473,8 +1479,18 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) /* * DIALECT REGISTRY */ + +/*[clinic input] +_csv.list_dialects + +Return a list of all known dialect names. + + names = csv.list_dialects() +[clinic start generated code]*/ + static PyObject * -csv_list_dialects(PyObject *module, PyObject *args) +_csv_list_dialects_impl(PyObject *module) +/*[clinic end generated code: output=a5b92b215b006a6d input=8953943eb17d98ab]*/ { return PyDict_Keys(get_csv_state(module)->dialects); } @@ -1506,11 +1522,23 @@ csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs) Py_RETURN_NONE; } + +/*[clinic input] +_csv.unregister_dialect + + name: object + +Delete the name/dialect mapping associated with a string name. + + csv.unregister_dialect(name) +[clinic start generated code]*/ + static PyObject * -csv_unregister_dialect(PyObject *module, PyObject *name_obj) +_csv_unregister_dialect_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=0813ebca6c058df4 input=6b5c1557bf60c7e7]*/ { _csvstate *module_state = get_csv_state(module); - if (PyDict_DelItem(module_state->dialects, name_obj) < 0) { + if (PyDict_DelItem(module_state->dialects, name) < 0) { if (PyErr_ExceptionMatches(PyExc_KeyError)) { PyErr_Format(module_state->error_obj, "unknown dialect"); } @@ -1519,21 +1547,42 @@ csv_unregister_dialect(PyObject *module, PyObject *name_obj) Py_RETURN_NONE; } +/*[clinic input] +_csv.get_dialect + + name: object + +Return the dialect instance associated with name. + + dialect = csv.get_dialect(name) +[clinic start generated code]*/ + static PyObject * -csv_get_dialect(PyObject *module, PyObject *name_obj) +_csv_get_dialect_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=aa988cd573bebebb input=edf9ddab32e448fb]*/ { - return get_dialect_from_registry(name_obj, get_csv_state(module)); + return get_dialect_from_registry(name, get_csv_state(module)); } +/*[clinic input] +_csv.field_size_limit + + new_limit: object = NULL + +Sets an upper limit on parsed fields. + + csv.field_size_limit([limit]) + +Returns old limit. If limit is not given, no new limit is set and +the old limit is returned +[clinic start generated code]*/ + static PyObject * -csv_field_size_limit(PyObject *module, PyObject *args) +_csv_field_size_limit_impl(PyObject *module, PyObject *new_limit) +/*[clinic end generated code: output=f2799ecd908e250b input=cec70e9226406435]*/ { - PyObject *new_limit = NULL; _csvstate *module_state = get_csv_state(module); long old_limit = module_state->field_limit; - - if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit)) - return NULL; if (new_limit != NULL) { if (!PyLong_CheckExact(new_limit)) { PyErr_Format(PyExc_TypeError, @@ -1650,44 +1699,21 @@ PyDoc_STRVAR(csv_writer_doc, "\n" "The \"fileobj\" argument can be any object that supports the file API.\n"); -PyDoc_STRVAR(csv_list_dialects_doc, -"Return a list of all know dialect names.\n" -" names = csv.list_dialects()"); - -PyDoc_STRVAR(csv_get_dialect_doc, -"Return the dialect instance associated with name.\n" -" dialect = csv.get_dialect(name)"); - PyDoc_STRVAR(csv_register_dialect_doc, "Create a mapping from a string name to a dialect class.\n" " dialect = csv.register_dialect(name[, dialect[, **fmtparams]])"); -PyDoc_STRVAR(csv_unregister_dialect_doc, -"Delete the name/dialect mapping associated with a string name.\n" -" csv.unregister_dialect(name)"); - -PyDoc_STRVAR(csv_field_size_limit_doc, -"Sets an upper limit on parsed fields.\n" -" csv.field_size_limit([limit])\n" -"\n" -"Returns old limit. If limit is not given, no new limit is set and\n" -"the old limit is returned"); - static struct PyMethodDef csv_methods[] = { { "reader", (PyCFunction)(void(*)(void))csv_reader, METH_VARARGS | METH_KEYWORDS, csv_reader_doc}, { "writer", (PyCFunction)(void(*)(void))csv_writer, METH_VARARGS | METH_KEYWORDS, csv_writer_doc}, - { "list_dialects", (PyCFunction)csv_list_dialects, - METH_NOARGS, csv_list_dialects_doc}, { "register_dialect", (PyCFunction)(void(*)(void))csv_register_dialect, METH_VARARGS | METH_KEYWORDS, csv_register_dialect_doc}, - { "unregister_dialect", (PyCFunction)csv_unregister_dialect, - METH_O, csv_unregister_dialect_doc}, - { "get_dialect", (PyCFunction)csv_get_dialect, - METH_O, csv_get_dialect_doc}, - { "field_size_limit", (PyCFunction)csv_field_size_limit, - METH_VARARGS, csv_field_size_limit_doc}, + _CSV_LIST_DIALECTS_METHODDEF + _CSV_UNREGISTER_DIALECT_METHODDEF + _CSV_GET_DIALECT_METHODDEF + _CSV_FIELD_SIZE_LIMIT_METHODDEF { NULL, NULL } }; diff --git a/Modules/clinic/_csv.c.h b/Modules/clinic/_csv.c.h new file mode 100644 index 0000000..41c0cdd --- /dev/null +++ b/Modules/clinic/_csv.c.h @@ -0,0 +1,134 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_csv_list_dialects__doc__, +"list_dialects($module, /)\n" +"--\n" +"\n" +"Return a list of all known dialect names.\n" +"\n" +" names = csv.list_dialects()"); + +#define _CSV_LIST_DIALECTS_METHODDEF \ + {"list_dialects", (PyCFunction)_csv_list_dialects, METH_NOARGS, _csv_list_dialects__doc__}, + +static PyObject * +_csv_list_dialects_impl(PyObject *module); + +static PyObject * +_csv_list_dialects(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _csv_list_dialects_impl(module); +} + +PyDoc_STRVAR(_csv_unregister_dialect__doc__, +"unregister_dialect($module, /, name)\n" +"--\n" +"\n" +"Delete the name/dialect mapping associated with a string name.\n" +"\n" +" csv.unregister_dialect(name)"); + +#define _CSV_UNREGISTER_DIALECT_METHODDEF \ + {"unregister_dialect", (PyCFunction)(void(*)(void))_csv_unregister_dialect, METH_FASTCALL|METH_KEYWORDS, _csv_unregister_dialect__doc__}, + +static PyObject * +_csv_unregister_dialect_impl(PyObject *module, PyObject *name); + +static PyObject * +_csv_unregister_dialect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"name", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "unregister_dialect", 0}; + PyObject *argsbuf[1]; + PyObject *name; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + name = args[0]; + return_value = _csv_unregister_dialect_impl(module, name); + +exit: + return return_value; +} + +PyDoc_STRVAR(_csv_get_dialect__doc__, +"get_dialect($module, /, name)\n" +"--\n" +"\n" +"Return the dialect instance associated with name.\n" +"\n" +" dialect = csv.get_dialect(name)"); + +#define _CSV_GET_DIALECT_METHODDEF \ + {"get_dialect", (PyCFunction)(void(*)(void))_csv_get_dialect, METH_FASTCALL|METH_KEYWORDS, _csv_get_dialect__doc__}, + +static PyObject * +_csv_get_dialect_impl(PyObject *module, PyObject *name); + +static PyObject * +_csv_get_dialect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"name", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "get_dialect", 0}; + PyObject *argsbuf[1]; + PyObject *name; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + name = args[0]; + return_value = _csv_get_dialect_impl(module, name); + +exit: + return return_value; +} + +PyDoc_STRVAR(_csv_field_size_limit__doc__, +"field_size_limit($module, /, new_limit=<unrepresentable>)\n" +"--\n" +"\n" +"Sets an upper limit on parsed fields.\n" +"\n" +" csv.field_size_limit([limit])\n" +"\n" +"Returns old limit. If limit is not given, no new limit is set and\n" +"the old limit is returned"); + +#define _CSV_FIELD_SIZE_LIMIT_METHODDEF \ + {"field_size_limit", (PyCFunction)(void(*)(void))_csv_field_size_limit, METH_FASTCALL|METH_KEYWORDS, _csv_field_size_limit__doc__}, + +static PyObject * +_csv_field_size_limit_impl(PyObject *module, PyObject *new_limit); + +static PyObject * +_csv_field_size_limit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"new_limit", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "field_size_limit", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *new_limit = NULL; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + new_limit = args[0]; +skip_optional_pos: + return_value = _csv_field_size_limit_impl(module, new_limit); + +exit: + return return_value; +} +/*[clinic end generated code: output=d51f3c42e9b88802 input=a9049054013a1b77]*/ |