facebook / facebook/pyrefly

Inconsistent narrowing with different but equivalent callable constraints.

Open
#1,605 2 comments 0 reactions 0 assignees View on GitHub
narrowing needs-discussion scoping-control-flow typechecking
Dominant language
Rust
Stars
7k
Forks
516
PR merge metrics
No merged PRs in 30d

Description

### Describe the Bug

In python there are roughly 5 distinct but from a typing POV equivalent ways to check whether something is callable:

1. `builtins.callable(x)`
2. `isinstance(x, collections.abc.Callable)`
3. `isinstance(x, AnyCallable)` (Protocol with `def __call__(self, *args: Any, **kwargs: Any) -> Any`)
4. `case collections.abc.Callable()`
5. `case AnyCallable()`

Consequently, these should give equivalent narrowing, but they do not. `pyrefly` also currently lacks support for ② (#1604)

The attached sandbox contains a full test suite. For each test class, all test cases should yield identical `reveal_type` results, but they currently do not.

### Sandbox Link

https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEAxrlLAwC4S7pyGrYN0INYrkps6AYVQs%2BsADrow1em1LEI6AOaDho8QEF0pADR0ACtTa4mUU5RgA3GNID6q4jDsBXdBxowXBgALGAYAa1kYBWj0AAFKHz8A4NCI7Hl0BihUODg6Q1IpGXSYAAoLXCsbAEpEBToGugBiOhgARy8IB2kYXzorSWlskoBtQnHTAoBdesbMGDA6F0Ch5dK4GCgwUwAqVEpNOER8o12dsIB3fcPjguq6AFoAPhPSY-HCGIUsnLyJLgY9jYMCKw1gdXQjTo80WywYqxc6022zo%2BGOuGwACtQmxTAB6e7PQS%2Bd7jL6ZbK5OgAFXgbAA8liccdmv06XQLhA2EE6NcvP4%2BrhFu4YHQAAYY7HsMWzBowtlwNgrYqwJFbUxouiSnGEl4AOS4MAhUKhEEW8JVZXwtVlJqh9icrhFpWtMSh8uBipcEDgGkVGAYySGkTVKM12vYuroBvQRttpsWPr9bADVtMoMiNshdpNDucUDcait1TdcwWCqVSe4KcyAWIlmszFDGvRTMjj31huNObNgl91dTLsmRgzJSzOdzjnzhY8LpL6FtHrpLhoqDYwWVYLKG3VqNbUrYUZjcezdtX655aPjOfhG0GltK9xydDA6G7E7teadRdKr-ni-LT0lXPDd60qRsoGbPctTbQ8O2jLtrwaEDL3fD9b1FApR1VJ88lfNCP0aL8C2dP9yR%2BKlaUVbCjQaFogI5LkeT5AVxCFfoi3FGiRhGCM2CmUwNH4mVT2hQDlwtLcoM1bjeNggTiX4o9ENEhNGGDEo5wInNiJnYtSzlcSvSrf1a03EMdzDY5ZL4hShKmZTY20hpexMmtAyHe8t3HQi6F051XQXUSl2M-tTMDFwwKqJtLJbLzIh42zBN8Bz4OPZzBETML3LTV4aJ8wj-J-QKAOFZcUPMzTYugmz5OSpS0pUicUL3JCTQw%2BLNNwl83zaicitnMigvdIzgLXUCGxsaTrI02BErqxTUqJdK2paq9VJvHJMJHWaym6-C%2Bp0qdv0G9B-yCii8ioth-kyIEYAAMR8dhODfOiK0Y7leQOflejY4VOLFW7ARgYEaJEkayq9SSLOROLgfu-LGqctrexhzTrQy%2B1jpI4rzshitvWy1NKtVaqZIBRHdsck8J1c4na08-KsaInG9LnAyxKhysGYiqKIOmyRKdBkFqeR2meyy5NB3wYdCmplmGgG-ThrLbmV3GoJSe3OGauFsGxeWpqczWxX1LvGjH15PDeo2wq2dIs7OZCsaL0iyaYt1im7pFpGjZRu26FNw6Gg6rDdqt58DsD-qHZ-P8QGMEAvA4KAeDICgWgAVVTrlSBfZ6OC4OAYnlMBRHPFx0H5bAYEoF1jiEqNFUoNCgS8ShITAOQQD1Gu6%2BOYB8AAXx7hRE5AMh7DAKBSEIKwaCgTPzFIafZ7oNAsDwfBGC4SBNA7tdXs%2BdAWgAZRgUUgjYNhiCOPE8SnhZZ8IURNDxXo8Uwaw4DxJhFAgAfSgR8uB4hfKIXk3RoCRF3gAoBIDIS4GIEXbgJ8yDci4A8JwlBfRcDoAAXjoD3AAzIQAAjAAJjHugEAw8k6oBek4B60AYAUE3jgAgJByDDyAA

### (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.