Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Embed the dtype-like types in the scalar types

未关闭
#138 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
25/100
Issue 类型
功能
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
tooling

调研方向

首先检查标量类型存根和 _numtype 定义,尤其是现有的 _numtype.ToDType* 别名和 CastsWith* 别名。检查受支持的类型检查器是否能够解析所提议的 __dtype_like__ 和 CanDTypeLike 签名。完成的标准是:各个别名在不丢失特异性的情况下得到统一,并且受影响的标量类型行为已通过验证。

由索引模型根据 Issue 内容生成。

描述

stubs: Enhancement stubs: Refactor

Similar to the NEP 50 embeddings that are powering the _numtype.CastsWith* type alias, it should be possible to create an dynamically specializing dtype-like alias. This unifies all 24 individual _numtype.ToDType* as a single generic type, without loss of specificity.


The idea is to define a type-check only method in each scalar-type, e.g in int8:

@type_check_only
def __dtype_like__(self, like: int8, /) -> tuple[
    type[int8 | ct.c_int8] | HasDType[int8] | L["int8", "i1", ...],
    Self,
]: ...

The return-types of must not overlap, and overloads cannot be used, and don't annotate like with Self.


In _numtype:

@type_check_only
class CanDTypeLike[
    +DTypeLikeT,
    +OutT: np.generic,
    -LikeT: np.generic = np.generic,
](Protocol):
    def __dtype_like__(self, like: LikeT, /) -> tuple[DTypeLikeT, OutT]: ...

And I'm hoping it can be used like this

def scalar[
    DTypeLikeT, 
    OutT: (bool_, int8, uint8, int16, ...),
    LikeT: np.generic = np.generic,
](
    dtype: _DTypeLikeT,
    *,
    like: LikeT | None = None
    __out: CanDTypeLike[DTypeLikeT, OutT, LikeT] = ...,  # type-check only
) -> OutT: ...

The LikeT is optional, but can be used to dynamically constrain OutT. It can also be provided manually, which is less verbose than having to re-define the entire "typevar with constraints".

It's not certain whether this will work in practice, as it requires pretty powerful constraint solving. I guess there's only one way to find out 🤷🏻

主要语言
Python
星标
80
派生
9
平均合并
3 分钟
30 天内合并 PR
3

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

numpy/numtype 的其他 Issue

查看 numpy/numtype 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

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