get_type_hints(barfoo3, globals(), locals(), include_extras=True)["x"],
BA2
)
+ BA3 = typing.Annotated[int | float, "const"]
+ def barfoo4(x: BA3): ...
+ self.assertEqual(
+ get_type_hints(barfoo4, globals(), locals()),
+ {"x": int | float}
+ )
+ self.assertEqual(
+ get_type_hints(barfoo4, globals(), locals(), include_extras=True),
+ {"x": typing.Annotated[int | float, "const"]}
+ )
def test_get_type_hints_annotated_refs(self):
.nb_or = _Py_union_type_or, // Add __or__ function
};
+static const char* const cls_attrs[] = {
+ "__module__", // Required for compatibility with typing module
+ NULL,
+};
+
+static PyObject *
+union_getattro(PyObject *self, PyObject *name)
+{
+ unionobject *alias = (unionobject *)self;
+ if (PyUnicode_Check(name)) {
+ for (const char * const *p = cls_attrs; ; p++) {
+ if (*p == NULL) {
+ break;
+ }
+ if (_PyUnicode_EqualToASCIIString(name, *p)) {
+ return PyObject_GetAttr((PyObject *) Py_TYPE(alias), name);
+ }
+ }
+ }
+ return PyObject_GenericGetAttr(self, name);
+}
+
PyTypeObject _PyUnion_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_name = "types.UnionType",
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
.tp_traverse = union_traverse,
.tp_hash = union_hash,
- .tp_getattro = PyObject_GenericGetAttr,
+ .tp_getattro = union_getattro,
.tp_members = union_members,
.tp_methods = union_methods,
.tp_richcompare = union_richcompare,