我正在为一个项目构建神经网络,但类型提示具有误导性
代码如下:
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 调试器解决这些问题并正确确定它是一个元组
因此,等效语法(使用
:
进行切片表示法,并通过创建切片对象)会产生两种不同的类型提示 - 一种是正确的,另一种是错误的。
正如 @InSync 在他的评论中所说,这似乎是 pycharm 的一个错误。