Skip to content

Inconsistent narrowing with different but equivalent callable constraints. #1605

@randolf-scholz

Description

@randolf-scholz

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-discussionAn issue where it's not clear whether there is a bug or we are behaving as expected.scoping-control-flowissues related to scoping and control flowtypechecking

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions