Final (context-sensitive Literal) doesn't support type narrowing
Open
Nobody has claimed this yet.
bug
topic-final
topic-literal-types
topic-type-narrowing
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Bug Report
Maybe there's a reason this is not supported, but at a quick look it seems like it should work. When a union of context-sensitive Literals are used, it fails to perform type narrowing, whereas explicit Literals do work.
To Reproduce
from typing import Final, Literal
class TXTRecord:
type: Final = "TXT"
text: str = "Foo"
class ARecord:
type: Final = "A"
host: str = "192.168.1.1"
record: TXTRecord | ARecord
reveal_type(record.type)
if record.type == "TXT":
print(record.text) # error with Final, but not with Literal
else:
print(record.host) # error with Final, but not with Literal
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
Start by running the provided Python reproduction and compare its narrowing behavior with the equivalent explicit Literal case. The work is done when the Final-based union narrows to TXTRecord and ARecord in the two branches without producing the reported attribute errors.
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
- Clearly specified
- Newbie friendliness
- 45/100