使用切片表示法会产生错误的类型提示

问题描述 投票:0回答:1

我正在为一个项目构建神经网络,但类型提示具有误导性

代码如下:

import typing
class Layer:
    pass

class Network:
    def __init__(self, *layers: Layer):
        self._layers=layers

    @typing.overload
    def __getitem__(self, item: int) -> Layer: #x[0] -> Layer
        pass

    @typing.overload
    def __getitem__(self, item: slice) -> list[Layer]: #x[:] -> list
        pass

    def __getitem__(self, item: int | slice) -> Layer | list[Layer]:
       return self._layers[item] #returns tuple, not list - but doesn't flag up as wrong

在我的测试代码中我有这个:

x=Network()
layers=x[:] #should be list[Layer]
layers2=x[slice(None,None,None)] #equivalent syntax, should also be list[Layer]

我看到的是这样的:

pycharm中layers变量的类型提示是Network

pycharm中layers2变量的类型提示是list

pycharm 调试器解决这些问题并正确确定它是一个元组

因此,等效语法(使用

:
进行切片表示法,并通过创建切片对象)会产生两种不同的类型提示 - 一种是正确的,另一种是错误的。

python python-3.x pycharm type-hinting
1个回答
0
投票

正如 @InSync 在他的评论中所说,这似乎是 pycharm 的一个错误。

错误链接:https://youtrack.jetbrains.com/issue/PY-42359

© www.soinside.com 2019 - 2024. All rights reserved.