Skip to content

Commit 036dd17

Browse files
committed
kwdefault under getter/setter
1 parent 2ee74bc commit 036dd17

File tree

2 files changed

+119
-48
lines changed

2 files changed

+119
-48
lines changed

Objects/clinic/funcobject.c.h

Lines changed: 59 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Objects/funcobject.c

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -680,49 +680,6 @@ func_set_qualname(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
680680
return 0;
681681
}
682682

683-
static PyObject *
684-
func_get_kwdefaults(PyObject *self, void *Py_UNUSED(ignored))
685-
{
686-
PyFunctionObject *op = _PyFunction_CAST(self);
687-
if (PySys_Audit("object.__getattr__", "Os",
688-
op, "__kwdefaults__") < 0) {
689-
return NULL;
690-
}
691-
if (op->func_kwdefaults == NULL) {
692-
Py_RETURN_NONE;
693-
}
694-
return Py_NewRef(op->func_kwdefaults);
695-
}
696-
697-
static int
698-
func_set_kwdefaults(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
699-
{
700-
PyFunctionObject *op = _PyFunction_CAST(self);
701-
if (value == Py_None)
702-
value = NULL;
703-
/* Legal to del f.func_kwdefaults.
704-
* Can only set func_kwdefaults to NULL or a dict. */
705-
if (value != NULL && !PyDict_Check(value)) {
706-
PyErr_SetString(PyExc_TypeError,
707-
"__kwdefaults__ must be set to a dict object");
708-
return -1;
709-
}
710-
if (value) {
711-
if (PySys_Audit("object.__setattr__", "OsO",
712-
op, "__kwdefaults__", value) < 0) {
713-
return -1;
714-
}
715-
} else if (PySys_Audit("object.__delattr__", "Os",
716-
op, "__kwdefaults__") < 0) {
717-
return -1;
718-
}
719-
720-
handle_func_event(PyFunction_EVENT_MODIFY_KWDEFAULTS, op, value);
721-
_PyFunction_ClearVersion(op);
722-
Py_XSETREF(op->func_kwdefaults, Py_XNewRef(value));
723-
return 0;
724-
}
725-
726683
static PyObject *
727684
func_get_annotate(PyObject *self, void *Py_UNUSED(ignored))
728685
{
@@ -1036,12 +993,12 @@ function___code___set_impl(PyFunctionObject *self, PyObject *value)
1036993
@getter
1037994
function.__defaults__
1038995
1039-
Get function arguments with default values
996+
Get positional arguments with default values for a function.
1040997
[clinic start generated code]*/
1041998

1042999
static PyObject *
10431000
function___defaults___get_impl(PyFunctionObject *self)
1044-
/*[clinic end generated code: output=e3da51b321d94a7a input=08ee98381f3099e7]*/
1001+
/*[clinic end generated code: output=e3da51b321d94a7a input=179dc99d1b7f07b8]*/
10451002
{
10461003
if (PySys_Audit("object.__getattr__", "Os", self, "__defaults__") < 0) {
10471004
return NULL;
@@ -1087,10 +1044,67 @@ function___defaults___set_impl(PyFunctionObject *self, PyObject *value)
10871044
return 0;
10881045
}
10891046

1047+
/*[clinic input]
1048+
@critical_section
1049+
@getter
1050+
function.__kwdefaults__
1051+
1052+
Get keyword arguments with default values for a function.
1053+
[clinic start generated code]*/
1054+
1055+
static PyObject *
1056+
function___kwdefaults___get_impl(PyFunctionObject *self)
1057+
/*[clinic end generated code: output=e8218444acb1f699 input=59111109efd0d68b]*/
1058+
{
1059+
if (PySys_Audit("object.__getattr__", "Os",
1060+
self, "__kwdefaults__") < 0) {
1061+
return NULL;
1062+
}
1063+
if (self->func_kwdefaults == NULL) {
1064+
Py_RETURN_NONE;
1065+
}
1066+
return Py_NewRef(self->func_kwdefaults);
1067+
}
1068+
1069+
/*[clinic input]
1070+
@critical_section
1071+
@setter
1072+
function.__kwdefaults__
1073+
[clinic start generated code]*/
1074+
1075+
static int
1076+
function___kwdefaults___set_impl(PyFunctionObject *self, PyObject *value)
1077+
/*[clinic end generated code: output=83b577938befcbf5 input=bea7f945934013dd]*/
1078+
{
1079+
if (value == Py_None)
1080+
value = NULL;
1081+
/* Legal to del f.func_kwdefaults.
1082+
* Can only set func_kwdefaults to NULL or a dict. */
1083+
if (value != NULL && !PyDict_Check(value)) {
1084+
PyErr_SetString(PyExc_TypeError,
1085+
"__kwdefaults__ must be set to a dict object");
1086+
return -1;
1087+
}
1088+
if (value) {
1089+
if (PySys_Audit("object.__setattr__", "OsO",
1090+
self, "__kwdefaults__", value) < 0) {
1091+
return -1;
1092+
}
1093+
} else if (PySys_Audit("object.__delattr__", "Os",
1094+
self, "__kwdefaults__") < 0) {
1095+
return -1;
1096+
}
1097+
1098+
handle_func_event(PyFunction_EVENT_MODIFY_KWDEFAULTS, self, value);
1099+
_PyFunction_ClearVersion(self);
1100+
Py_XSETREF(self->func_kwdefaults, Py_XNewRef(value));
1101+
return 0;
1102+
}
1103+
10901104
static PyGetSetDef func_getsetlist[] = {
10911105
FUNCTION___CODE___GETSETDEF
10921106
FUNCTION___DEFAULTS___GETSETDEF
1093-
{"__kwdefaults__", func_get_kwdefaults, func_set_kwdefaults},
1107+
FUNCTION___KWDEFAULTS___GETSETDEF
10941108
FUNCTION___ANNOTATIONS___GETSETDEF
10951109
{"__annotate__", func_get_annotate, func_set_annotate},
10961110
{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},

0 commit comments

Comments
 (0)