Skip to content

Commit 26754f4

Browse files
committed
Revert generic Sprite, fixing typing issue with Sprite.add and Sprite.remove
1 parent 33f6abb commit 26754f4

File tree

1 file changed

+50
-52
lines changed

1 file changed

+50
-52
lines changed

buildconfig/stubs/pygame/sprite.pyi

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,12 @@ class _HasMaskAndRect(_HasRect, Protocol):
4747
class _HasRadiusAndRect(_HasRect, Protocol):
4848
radius: float
4949

50-
# generic Group, used in Sprite
51-
_TGroup = TypeVar("_TGroup", bound=AbstractGroup)
50+
# non-generic Group, used in Sprite
51+
_Group = AbstractGroup[_SupportsSprite]
5252

5353
# protocol helps with structural subtyping for typevars in sprite group generics
5454
# and allows the use of any class with the required attributes and methods
55-
class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol):
56-
def __class_getitem__(cls, item: type[AbstractGroup], /) -> types.GenericAlias: ...
55+
class _SupportsSprite(_HasImageAndRect, Protocol):
5756
@property
5857
def image(self) -> Optional[Surface]: ...
5958
@image.setter
@@ -66,17 +65,17 @@ class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol):
6665
def layer(self) -> int: ...
6766
@layer.setter
6867
def layer(self, value: int) -> None: ...
69-
def add_internal(self, group: _TGroup) -> None: ...
70-
def remove_internal(self, group: _TGroup) -> None: ...
68+
def add_internal(self, group: _Group) -> None: ...
69+
def remove_internal(self, group: _Group) -> None: ...
7170
def update(self, *args: Any, **kwargs: Any) -> None: ...
72-
def add(self, *groups: _TGroup) -> None: ...
73-
def remove(self, *groups: _TGroup) -> None: ...
71+
def add(self, *groups: _Group) -> None: ...
72+
def remove(self, *groups: _Group) -> None: ...
7473
def kill(self) -> None: ...
7574
def alive(self) -> bool: ...
76-
def groups(self) -> list[_TGroup]: ...
75+
def groups(self) -> list[_Group]: ...
7776

7877
# also a protocol
79-
class _SupportsDirtySprite(_SupportsSprite[_TGroup], Protocol):
78+
class _SupportsDirtySprite(_SupportsSprite, Protocol):
8079
dirty: int
8180
blendmode: int
8281
source_rect: Union[FRect, Rect]
@@ -86,7 +85,7 @@ class _SupportsDirtySprite(_SupportsSprite[_TGroup], Protocol):
8685
def _get_visible(self) -> int: ...
8786

8887
# concrete sprite implementation class
89-
class Sprite(_SupportsSprite[_TGroup]):
88+
class Sprite(_SupportsSprite):
9089
@property
9190
def image(self) -> Optional[Surface]: ...
9291
@image.setter
@@ -99,18 +98,18 @@ class Sprite(_SupportsSprite[_TGroup]):
9998
def layer(self) -> int: ...
10099
@layer.setter
101100
def layer(self, value: int) -> None: ...
102-
def __init__(self, *groups: _TGroup) -> None: ...
103-
def add_internal(self, group: _TGroup) -> None: ...
104-
def remove_internal(self, group: _TGroup) -> None: ...
101+
def __init__(self, *groups: _Group) -> None: ...
102+
def add_internal(self, group: _Group) -> None: ...
103+
def remove_internal(self, group: _Group) -> None: ...
105104
def update(self, *args: Any, **kwargs: Any) -> None: ...
106-
def add(self, *groups: _TGroup) -> None: ...
107-
def remove(self, *groups: _TGroup) -> None: ...
105+
def add(self, *groups: _Group) -> None: ...
106+
def remove(self, *groups: _Group) -> None: ...
108107
def kill(self) -> None: ...
109108
def alive(self) -> bool: ...
110-
def groups(self) -> list[_TGroup]: ...
109+
def groups(self) -> list[_Group]: ...
111110

112111
# concrete dirty sprite implementation class
113-
class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]):
112+
class DirtySprite(Sprite, _SupportsDirtySprite):
114113
dirty: int
115114
blendmode: int
116115
source_rect: Union[FRect, Rect]
@@ -122,33 +121,32 @@ class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]):
122121
# typevar bound to Sprite, _SupportsSprite Protocol ensures sprite
123122
# subclass passed to group has image and rect attributes
124123
_TSprite = TypeVar("_TSprite", bound=_SupportsSprite)
124+
_TSprite_co = TypeVar("_TSprite_co", bound=_SupportsSprite, covariant=True)
125125
_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite)
126126

127127
# almost the same as _TSprite but bound to DirtySprite
128-
_TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite)
128+
_TDirtySprite_co = TypeVar("_TDirtySprite_co", bound=_SupportsDirtySprite, covariant=True)
129129

130130
# typevar for sprite or iterable of sprites, used in Group init, add and remove
131-
_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable[_TSprite]]]
131+
_SpriteOrIterable = Union[_TSprite_co, Iterable[_SpriteOrIterable[_TSprite_co]]]
132132

133-
class AbstractGroup(Generic[_TSprite]):
134-
spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]]
133+
class AbstractGroup(Generic[_TSprite_co]):
134+
spritedict: dict[_TSprite_co, Optional[Union[FRect, Rect]]]
135135
lostsprites: list[Union[FRect, Rect]]
136-
def __class_getitem__(
137-
cls, item: type[_SupportsSprite], /
138-
) -> types.GenericAlias: ...
136+
def __class_getitem__(cls, item: Any, /) -> types.GenericAlias: ...
139137
def __init__(self) -> None: ...
140138
def __len__(self) -> int: ...
141-
def __iter__(self) -> Iterator[_TSprite]: ...
139+
def __iter__(self) -> Iterator[_TSprite_co]: ...
142140
def __bool__(self) -> bool: ...
143141
def __contains__(self, item: Any) -> bool: ...
144-
def add_internal(self, sprite: _TSprite, layer: None = None) -> None: ...
145-
def remove_internal(self, sprite: _TSprite) -> None: ...
146-
def has_internal(self, sprite: _TSprite) -> bool: ...
142+
def add_internal(self, sprite: _SupportsSprite, layer: None = None) -> None: ...
143+
def remove_internal(self, sprite: _SupportsSprite) -> None: ...
144+
def has_internal(self, sprite: _SupportsSprite) -> bool: ...
147145
def copy(self) -> Self: ...
148-
def sprites(self) -> list[_TSprite]: ...
149-
def add(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ...
150-
def remove(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ...
151-
def has(self, *sprites: _SpriteOrIterable[_TSprite]) -> bool: ...
146+
def sprites(self) -> list[_TSprite_co]: ...
147+
def add(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ...
148+
def remove(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ...
149+
def has(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> bool: ...
152150
def update(self, *args: Any, **kwargs: Any) -> None: ...
153151
def draw(
154152
self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0
@@ -160,41 +158,41 @@ class AbstractGroup(Generic[_TSprite]):
160158
) -> None: ...
161159
def empty(self) -> None: ...
162160

163-
class Group(AbstractGroup[_TSprite]):
164-
def __init__(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ...
161+
class Group(AbstractGroup[_TSprite_co]):
162+
def __init__(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ...
165163

166164
# these are aliased in the code too
167165
@deprecated("Use `pygame.sprite.Group` instead")
168-
class RenderPlain(Group[_TSprite]): ...
166+
class RenderPlain(Group[_TSprite_co]): ...
169167

170168
@deprecated("Use `pygame.sprite.Group` instead")
171-
class RenderClear(Group[_TSprite]): ...
169+
class RenderClear(Group[_TSprite_co]): ...
172170

173-
class RenderUpdates(Group[_TSprite]): ...
171+
class RenderUpdates(Group[_TSprite_co]): ...
174172

175173
@deprecated("Use `pygame.sprite.RenderUpdates` instead")
176-
class OrderedUpdates(RenderUpdates[_TSprite]): ...
174+
class OrderedUpdates(RenderUpdates[_TSprite_co]): ...
177175

178-
class LayeredUpdates(AbstractGroup[_TSprite]):
176+
class LayeredUpdates(AbstractGroup[_TSprite_co]):
179177
def __init__(
180-
self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any
178+
self, *sprites: _SpriteOrIterable[_TSprite_co], **kwargs: Any
181179
) -> None: ...
182-
def add(self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any) -> None: ...
183-
def get_sprites_at(self, pos: Point) -> list[_TSprite]: ...
184-
def get_sprite(self, idx: int) -> _TSprite: ...
185-
def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite]: ...
180+
def add(self, *sprites: _SpriteOrIterable[_TSprite_co], **kwargs: Any) -> None: ...
181+
def get_sprites_at(self, pos: Point) -> list[_TSprite_co]: ...
182+
def get_sprite(self, idx: int) -> _TSprite_co: ...
183+
def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite_co]: ...
186184
def layers(self) -> list[int]: ...
187-
def change_layer(self, sprite: _TSprite, new_layer: int) -> None: ...
188-
def get_layer_of_sprite(self, sprite: _TSprite) -> int: ...
185+
def change_layer(self, sprite: _SupportsSprite, new_layer: int) -> None: ...
186+
def get_layer_of_sprite(self, sprite: _SupportsSprite) -> int: ...
189187
def get_top_layer(self) -> int: ...
190188
def get_bottom_layer(self) -> int: ...
191-
def move_to_front(self, sprite: _TSprite) -> None: ...
192-
def move_to_back(self, sprite: _TSprite) -> None: ...
193-
def get_top_sprite(self) -> _TSprite: ...
194-
def get_sprites_from_layer(self, layer: int) -> list[_TSprite]: ...
189+
def move_to_front(self, sprite: _SupportsSprite) -> None: ...
190+
def move_to_back(self, sprite: _SupportsSprite) -> None: ...
191+
def get_top_sprite(self) -> _TSprite_co: ...
192+
def get_sprites_from_layer(self, layer: int) -> list[_TSprite_co]: ...
195193
def switch_layer(self, layer1_nr: int, layer2_nr: int) -> None: ...
196194

197-
class LayeredDirty(LayeredUpdates[_TDirtySprite]):
195+
class LayeredDirty(LayeredUpdates[_TDirtySprite_co]):
198196
def draw(
199197
self,
200198
surface: Surface,

0 commit comments

Comments
 (0)