@@ -860,44 +860,6 @@ func_set_annotate(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
860
860
}
861
861
}
862
862
863
- static PyObject *
864
- func_get_annotations (PyObject * self , void * Py_UNUSED (ignored ))
865
- {
866
- PyFunctionObject * op = _PyFunction_CAST (self );
867
- PyObject * d = NULL ;
868
- Py_BEGIN_CRITICAL_SECTION (self );
869
- if (op -> func_annotations == NULL &&
870
- (op -> func_annotate == NULL || !PyCallable_Check (op -> func_annotate ))) {
871
- op -> func_annotations = PyDict_New ();
872
- if (op -> func_annotations == NULL )
873
- return NULL ;
874
- }
875
- d = func_get_annotation_dict (op );
876
- Py_END_CRITICAL_SECTION ();
877
- return Py_XNewRef (d );
878
- }
879
-
880
- static int
881
- func_set_annotations (PyObject * self , PyObject * value , void * Py_UNUSED (ignored ))
882
- {
883
- PyFunctionObject * op = _PyFunction_CAST (self );
884
- if (value == Py_None )
885
- value = NULL ;
886
- /* Legal to del f.func_annotations.
887
- * Can only set func_annotations to NULL (through C api)
888
- * or a dict. */
889
- if (value != NULL && !PyDict_Check (value )) {
890
- PyErr_SetString (PyExc_TypeError ,
891
- "__annotations__ must be set to a dict object" );
892
- return -1 ;
893
- }
894
- Py_BEGIN_CRITICAL_SECTION (self );
895
- Py_XSETREF (op -> func_annotations , Py_XNewRef (value ));
896
- Py_CLEAR (op -> func_annotate );
897
- Py_END_CRITICAL_SECTION ();
898
- return 0 ;
899
- }
900
-
901
863
static PyObject *
902
864
func_get_type_params (PyObject * self , void * Py_UNUSED (ignored ))
903
865
{
@@ -936,19 +898,6 @@ _Py_set_function_type_params(PyThreadState *Py_UNUSED(ignored), PyObject *func,
936
898
return Py_NewRef (func );
937
899
}
938
900
939
- static PyGetSetDef func_getsetlist [] = {
940
- {"__code__" , func_get_code , func_set_code },
941
- {"__defaults__" , func_get_defaults , func_set_defaults },
942
- {"__kwdefaults__" , func_get_kwdefaults , func_set_kwdefaults },
943
- {"__annotations__" , func_get_annotations , func_set_annotations },
944
- {"__annotate__" , func_get_annotate , func_set_annotate },
945
- {"__dict__" , PyObject_GenericGetDict , PyObject_GenericSetDict },
946
- {"__name__" , func_get_name , func_set_name },
947
- {"__qualname__" , func_get_qualname , func_set_qualname },
948
- {"__type_params__" , func_get_type_params , func_set_type_params },
949
- {NULL } /* Sentinel */
950
- };
951
-
952
901
/*[clinic input]
953
902
class function "PyFunctionObject *" "&PyFunction_Type"
954
903
[clinic start generated code]*/
@@ -1064,6 +1013,68 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,
1064
1013
return (PyObject * )newfunc ;
1065
1014
}
1066
1015
1016
+ /*[clinic input]
1017
+ @critical_section
1018
+ @getter
1019
+ function.__annotations__
1020
+
1021
+ Dict of annotations in a function object.
1022
+ [clinic start generated code]*/
1023
+
1024
+ static PyObject *
1025
+ function___annotations___get_impl (PyFunctionObject * self )
1026
+ /*[clinic end generated code: output=a4cf4c884c934cbb input=ae1caef917be9bb2]*/
1027
+ {
1028
+ PyObject * d = NULL ;
1029
+ if (self -> func_annotations == NULL &&
1030
+ (self -> func_annotate == NULL || !PyCallable_Check (self -> func_annotate ))) {
1031
+ self -> func_annotations = PyDict_New ();
1032
+ if (self -> func_annotations == NULL )
1033
+ return NULL ;
1034
+ }
1035
+ d = func_get_annotation_dict (self );
1036
+ return Py_XNewRef (d );
1037
+ }
1038
+
1039
+ /*[clinic input]
1040
+ @critical_section
1041
+ @setter
1042
+ function.__annotations__
1043
+ [clinic start generated code]*/
1044
+
1045
+ static int
1046
+ function___annotations___set_impl (PyFunctionObject * self , PyObject * value )
1047
+ /*[clinic end generated code: output=a61795d4a95eede4 input=5302641f686f0463]*/
1048
+ {
1049
+ if (value == Py_None )
1050
+ value = NULL ;
1051
+ /* Legal to del f.func_annotations.
1052
+ * Can only set func_annotations to NULL (through C api)
1053
+ * or a dict. */
1054
+ if (value != NULL && !PyDict_Check (value )) {
1055
+ PyErr_SetString (PyExc_TypeError ,
1056
+ "__annotations__ must be set to a dict object" );
1057
+ return -1 ;
1058
+ }
1059
+ Py_XSETREF (self -> func_annotations , Py_XNewRef (value ));
1060
+ Py_CLEAR (self -> func_annotate );
1061
+ return 0 ;
1062
+ }
1063
+
1064
+ static PyGetSetDef func_getsetlist [] = {
1065
+ {"__code__" , func_get_code , func_set_code },
1066
+ {"__defaults__" , func_get_defaults , func_set_defaults },
1067
+ {"__kwdefaults__" , func_get_kwdefaults , func_set_kwdefaults },
1068
+ FUNCTION___ANNOTATIONS___GETSETDEF
1069
+ {"__annotate__" , func_get_annotate , func_set_annotate },
1070
+ {"__dict__" , PyObject_GenericGetDict , PyObject_GenericSetDict },
1071
+ {"__name__" , func_get_name , func_set_name },
1072
+ {"__qualname__" , func_get_qualname , func_set_qualname },
1073
+ {"__type_params__" , func_get_type_params , func_set_type_params },
1074
+ {NULL } /* Sentinel */
1075
+ };
1076
+
1077
+
1067
1078
static int
1068
1079
func_clear (PyObject * self )
1069
1080
{
0 commit comments