facebook / facebook/pyrefly

too restrictive type narrowing on loop variable

Open
#3,160 1 comment 0 reactions 0 assignees View on GitHub
narrowing typechecking
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.