too restrictive type narrowing on loop variable
- Dominant language
- Rust
- Stars
- 7k
- Forks
- 516
- PR merge metrics
- No merged PRs in 30d
Description
### Describe the Bug
I am iterating over a list that has either strings or dicts with values of Any.
If my entry is a string, i wrap it in a dict. pyrefly now either assumes a too narrow type for this dict, disallowing further modifications, or if I explicitly tell it the narrowed type it no longer allows the variable for the loop:
```py
from typing import Any
def foo(l: list[str | dict[str, Any]]) -> None:
for x in l: # Cannot use variable `x` with type `dict[str, Any]` to iterate over elements of type `dict[str, Any] | str` [bad-assignment]
if isinstance(x, str):
x: dict[str, Any] = {"bar": x}
x["baz"] = 0
def bar(l: list[str | dict[str, Any]]) -> None:
for x in l:
if isinstance(x, str):
x = {"bar": x}
x["baz"] = 0 # Cannot set item in `dict[str, str]` [unsupported-operation]
```
### Sandbox Link
https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0BBdKQA0dAMao4DADro5mGGDphcuABRREdKBGkBtaZToAfOpgjiGhhpTFDSAXUcBKOgFoAfHQByudDCIcnQhKrx0%2BJzoOkHRofEQynqs0hjiMOr4YkYusfH5ofjaFlY2doLCjnQAvHTAMiDYqJQN2vgAvsEFEfoNTQBeDVW1AAxy41hKdE2Umtq6Bkam5pbWRvaVrh7efgF5oarGkawxXQWJnHApDGkZWXQ5%2B92FNXV9za0RnXEF%2BL2NqEGIGGdDG8nBimUAzmOj0a1syxK8PKDmcbi8vn8gTOYSOUVOP3yF2S6FS6HSmWytlyOOekVqkmk6iRZQ2TjE9QBLSQXxctMK-wGQ1eYLkIBEIDIlCUUFIhAYtCgFAAxHQAAqkaVgWUPDA4AgSfyQNgAV0oqAYEH8hDkqoAyjAYHQABYMBjEOCIAD0XqlMrlvDYXpg6C9mFw4jgXvERogpvNlv8XtxdFQADdUNBUNhYIb0MazRardFcMRE6SbegyAxnf53GmYJQrv5Xg0AMyEACMACYGnJ9I3qE3HHITeguDw%2BDBMO4LNKrBAG68AORx9C8GDLuTrhjuaUARxNEGlM4A1jBSO5UOJ0nA4CuAO7NdBb9AgdoS6%2BWhsAMWgMAoNAsDwIgyHfIA
### (Only applicable for extension issues) IDE Information
_No response_
Contributor guide
Assessment
This issue has not been assessed yet.