(🐞) `always-true`/`always-false` doesn't activate until it's truth is checked
Open
Nobody has claimed this yet.
bug
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
test.py:
from typing import Literal
def foo(a: Literal[True]) -> None:
...
FOO: bool
foo(FOO) # error: Argument 1 to "foo" has incompatible type "bool"; expected "Literal[True]" [arg-type]
reveal_type(FOO) # note: Revealed type is "builtins.bool"
if not FOO:
pass
reveal_type(FOO) # note: Revealed type is "Literal[True]"
if not FOO:
pass
import test2
test2.py:
from test import FOO
reveal_type(FOO) # note: Revealed type is "builtins.bool"
if FOO:
pass
reveal_type(FOO) # note: Revealed type is "Literal[True]"
> mypy --always-true FOO test.py
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 report with test.py and test2.py using mypy --always-true FOO test.py, comparing the revealed types before and after each truth check. Trace the handling of --always-true and imported FOO; done when the reported narrowing behavior is consistent without requiring a prior truth check.
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
- 45/100