(🎁) `isinstance`/`issubclass` only accept `typing.Union`s of `type`s, not other type forms
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Until type forms are properly supported by the type system, I wonder if this could be special cased?
from typing import Any
isinstance(1, str | Any) # no error, fails at runtime with TypeError: typing.Any cannot be used with issubclass()
FYI mypy is incorrectly inferring this as a types.UnionType but it is actually a typing.Union(#12369), I don't think you can have a UnionType with type forms in it.
PyCharm correctly warns here:

related: python/typeshed/issues/7505
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the isinstance(1, str | Any) example and compare mypy's inferred types.UnionType with the runtime behavior described in the issue. Read the related typeshed issue #7505 and trace the type-checking path for isinstance and issubclass; done means the supported type forms are handled consistently without permitting the reported invalid case.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100