按非整数切片和类型检查

Slicing by non-integers and type checking

提问人:Oblomov 提问时间:4/19/2023 最后编辑:Oblomov 更新时间:4/19/2023 访问量:53

问:

我正在处理时间序列,并希望按日期/时间检索和切片。理想情况下,我会利用现有的 [:] 语法。

例如(见最后一行):

from datetime import datetime
from typing import Union


class T:
    def __getitem__(self, key: datetime | slice) -> Union['T', float]:
        if isinstance(key, slice):
            return T()
        if isinstance(key, datetime):
            return 42
        raise ValueError()


t = T()
v = t[datetime(2020, 1, 1)]                        # OK
t2 = t[datetime(2020, 1, 1):datetime(2021, 1, 1)]  # Not OK

这运行良好,但是当通过 mypy 运行它时,它会在最后一行产生以下错误:

error: Slice index must be an integer, SupportsIndex or None  [misc]
Found 1 error in 1 file (checked 1 source file)

除了完全禁用此错误之外,有没有一种方法可以使此代码通过mypy?

还是我在做一些我不该做的事情?

python-3.x slice mypy 类型卫士

评论

1赞 Daniil Fajnberg 4/20/2023
不,你没有做错任何事。这是对类型的不合理限制。看到这个长期存在的问题。slice
0赞 Oblomov 5/17/2023
这确实是问题所在。根据 github 中的工单,我在有问题的行中添加了 # type: ignore[misc] 注释。
1赞 Daniil Fajnberg 5/17/2023
我最近开了一个 PR 来制作仿制药,但它至少在 PEP 696 登陆之前被搁置了。因此,可能需要一段时间才能解决此问题。但我会尽我所能保持领先地位,并在我们缺少工具后立即重新提交 PR。slice

答: 暂无答案