bpo-44662: Add ability to annotate types.Union (GH-27214) (GH-27461)

Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
(cherry picked from commit 8182c8329c)

Co-authored-by: Yurii Karabas <1998uriyyo@gmail.com>
This commit is contained in:
Miss Islington (bot) 2021-07-30 02:31:54 -07:00 committed by GitHub
parent 0b984d1ccc
commit 472997659b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 1 deletions

View file

@ -3009,6 +3009,16 @@ def barfoo3(x: BA2): ...
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):

View file

@ -0,0 +1,3 @@
Add ``__module__`` to ``types.Union``. This also fixes
``types.Union`` issues with ``typing.Annotated``. Patch provided by
Yurii Karabas.

View file

@ -422,6 +422,28 @@ static PyNumberMethods union_as_number = {
.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",
@ -435,7 +457,7 @@ PyTypeObject _PyUnion_Type = {
.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,