_testcapi.function_get_closure(function_without_closure), (1, 2))
self.assertEqual(function_without_closure.__closure__, (1, 2))
+ def test_function_get_annotations(self):
+ # Test PyFunction_GetAnnotations()
+ def normal():
+ pass
+
+ def annofn(arg: int) -> str:
+ return f'arg = {arg}'
+
+ annotations = _testcapi.function_get_annotations(normal)
+ self.assertIsNone(annotations)
+
+ annotations = _testcapi.function_get_annotations(annofn)
+ self.assertIsInstance(annotations, dict)
+ self.assertEqual(annotations, annofn.__annotations__)
+
+ with self.assertRaises(SystemError):
+ _testcapi.function_get_annotations(None)
+
# TODO: test PyFunction_New()
# TODO: test PyFunction_NewWithQualName()
# TODO: test PyFunction_SetVectorcall()
- # TODO: test PyFunction_GetAnnotations()
# TODO: test PyFunction_SetAnnotations()
# TODO: test PyClassMethod_New()
# TODO: test PyStaticMethod_New()
}
+static PyObject *
+function_get_annotations(PyObject *self, PyObject *func)
+{
+ return Py_XNewRef(PyFunction_GetAnnotations(func));
+}
+
+
static PyMethodDef test_methods[] = {
{"function_get_code", function_get_code, METH_O, NULL},
{"function_get_globals", function_get_globals, METH_O, NULL},
{"function_set_kw_defaults", function_set_kw_defaults, METH_VARARGS, NULL},
{"function_get_closure", function_get_closure, METH_O, NULL},
{"function_set_closure", function_set_closure, METH_VARARGS, NULL},
+ {"function_get_annotations", function_get_annotations, METH_O, NULL},
{NULL},
};