I was making a dataset class by inheriting torch.utils.data.Dataset
and came across the following issue.
Unlike previous functions which returns a fixed type of values, __getitem__
doesn't.
For example,
class MyExample:
def __init__(self, some_list: list[int]):
self.some_list = some_list
def __getitem__(self, index):
return self.some_list[index]
MyExample[<index>]
will return int
, while MyExample[<slice>]
will return slice of int
. VScode intellisense automatically write T_co
for its type annotation, but I don't understand what this means.
For this you can use Unions as the actual annotation of the function and overload to allow you type checker to know that a slice is only returned when a slice is given and an int is given when only an int is given.
from typing import overload, Union
class MyExample:
def __init__(self, some_list: list[int]):
self.some_list = some_list
@overload
def __getitem__(self, index: int) -> int: ...
@overload
def __getitem__(self, index: slice) -> list[int]: ...
def __getitem__(self, index: Union[slice, int]) -> Union[list[int], int]: # Or Slice[int] if that's a thing
return self.some_list[index]
If your example is not only for list of ints but for general lists, you can change to Generic types.
...
is actual code.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With