python / python/typeshed

Should `callable` narrow to `TypeIs[Callable[..., object]]` or `TypeIs[Callable]` ?

未关闭
#16,050 6 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 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>

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 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

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。