facebook / facebook/pyrefly

bug: bound method identified as `(ParamSpec(Unknown)) -> Unknown` (by decorators) rejected as a `Callable[..., Any]`

Open
#3,666 2 comments 0 reactions 1 assignee Claimed by @mikeleppane View on GitHub
stale typechecking
Dominant language
Rust
Stars
7k
Forks
516
PR merge metrics
No merged PRs in 30d

Description

### Describe the Bug

A class method decorated like:

```
class Controller:
@deco1 # typed: def deco1[**P, R](func: Callable[P, R]) -> Callable[P, R]:
@deco2 # untyped: def deco2(func):
def controller_body(self):
pass
```

becomes a bound method whose revealed type is `(ParamSpec(Unknown)) -> Unknown` when taken as bound (`Controller().controller_body`).

However, Pyrefly rejects it as `Callable[..., Any];`. The same revealed type from a top-level function or explicit expression is accepted.

See the full PoC in the sandbox.

### Sandbox Link

https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSIEAtsbgE4AuABBOnMTAMYMA66YdXFSadcUWNwi42hVNk4sa9ZgGFU4ubD4ChTBqWKsA5otqMmdGADcY6gPr6OfZ1hhgmmLrgCMAbQBU-gAKADRMAEoAugAUYACu6JyITGoa2LC%2BoRGRAJRMALQAfCnqUJowmWFRiHxMdRYwDHF06EzxiS58nu6eogBMsQmcOTWt9ZZNLW1DnYllcHAp0gyC4jB0o-VMAAK9PrX1u159B3XdIsursHR2eJik0XAwUGAjp1tMxKgLLlvnGLgGAALdaPZ6vTYfOpfH7oFxHUTePgI3AnVzuXBxBhwCCeOztTjRN5jaHfOCzMCtAC8S3QKzE1yJhFEdKu61uuHu2nQfSYNL23miewGKkuDNBOVk6EBILoORyLksNnsjhgsXQCvQStsUAcBjVlL6mr4CQA7nRUMQOJg%2BSw2BxuIQzRbiOrNc7LdbeTTWOwuAwnehzZb1UaTUGXda7JjsbiYLbfQ6Ax7XTGcXiCZqQCEQGRLGAoKRCAwhFAKABiJhBUj5wtMNBYPD4C78CBGZqoBhSdCEPiVgDKMHjQIYDGIcEQAHpJ3m3IXCPQjJOYOhJ5hcJw4JOWZB2xau9JJ216ExUFZUNByi3dx2D61cMQ73Be%2BgyMDpPkbHQcdJbTwQAAzIQ3gnCAfC%2BOsgjfpE4bUGYDAwJg%2BSYBAliSDYtoAORttKliYXw0oMPklgAI5xKhiH5AA1jApD5KgnCcPAiw0phpqoC0%2BHoCAAC%2BOYMV2NgAGLQDAFANjgBAkOQPFAA

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