Should `callable` narrow to `TypeIs[Callable[..., object]]` or `TypeIs[Callable]` ?
未关闭
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 5.1k
- 派生
- 2.1k
- 平均合并
- 1 天 19 小时
- 30 天内合并 PR
- 82
描述
Currently, typeshed annotates
def callable(obj: object, /) -> TypeIs[Callable[..., object]]: ...
However, for the majority of type checkers this creates discrepancy between collections.abc.Callable and builtins.callable narrowing, only ty seems to consider blank Callable as if it were Callable[..., object], whereas all other type checkers treat it as Callable[..., Any].
from typing import reveal_type, TypeIs
from collections.abc import Callable
def is_callable(arg: object) -> TypeIs[Callable]:
raise NotImplementedError
def check_callable(arg: object) -> None:
if isinstance(arg, Callable):
reveal_type(arg)
def check_callable2(arg: object) -> None:
if callable(arg):
reveal_type(arg)
def check_callable3(arg: object) -> None:
if is_callable(arg):
reveal_type(arg)
| case | isinstance(x, Callable) | is_callable | callable(x) |
|---|---|---|---|
| mypy | ERROR | (...) -> Any | <callable subtype of object> |
| pyright | (...) -> Unknown | (...) -> Unknown | (...) -> object |
| pyrefly | (...) -> Unknown | (...) -> Unknown | (...) -> object |
| ty | (...) -> object | (...) -> Any | (...) -> object |
| zuban | ERROR | (...) -> Any | <callable subtype of object> |
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 builtins.callable 注解开始,并将其与 collections.abc.Callable 进行比较。根据 issue 中列出的 type-checker 行为运行示例,然后查看评论讨论,以确定哪个注解能够提供一致的 narrowing;当所选 stub 在所有受影响的 checker 中都符合预期行为时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- developer-experience, tooling
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 38/100