Skip to content

Commit 4128589

Browse files
committed
sprites are now generic to the groups they are contained in
1 parent 333e921 commit 4128589

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

buildconfig/stubs/pygame/sprite.pyi

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ from pygame.rect import FRect, Rect
2626
from pygame.surface import Surface
2727
from pygame.typing import Point, RectLike
2828

29-
# non-generic Group, used in Sprite
30-
_Group = AbstractGroup[_SupportsSprite]
29+
# generic Group, used in Sprite
30+
_TGroup = TypeVar("_TGroup", bound=AbstractGroup)
3131

3232
# define some useful protocols first, which sprite functions accept
3333
# sprite functions don't need all sprite attributes to be present in the
@@ -50,7 +50,8 @@ class _HasRadiusAndRect(_HasRect, Protocol):
5050
radius: float
5151

5252
# protocol helps with structural subtyping for typevars in sprite group generics
53-
class _SupportsSprite(_HasImageAndRect, Protocol):
53+
class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol):
54+
def __class_getitem__(cls, item: type[AbstractGroup], /) -> types.GenericAlias: ...
5455
@property
5556
def image(self) -> Optional[Surface]: ...
5657
@image.setter
@@ -63,17 +64,17 @@ class _SupportsSprite(_HasImageAndRect, Protocol):
6364
def layer(self) -> int: ...
6465
@layer.setter
6566
def layer(self, value: int) -> None: ...
66-
def add_internal(self, group: _Group) -> None: ...
67-
def remove_internal(self, group: _Group) -> None: ...
67+
def add_internal(self, group: _TGroup) -> None: ...
68+
def remove_internal(self, group: _TGroup) -> None: ...
6869
def update(self, *args: Any, **kwargs: Any) -> None: ...
69-
def add(self, *groups: _Group) -> None: ...
70-
def remove(self, *groups: _Group) -> None: ...
70+
def add(self, *groups: _TGroup) -> None: ...
71+
def remove(self, *groups: _TGroup) -> None: ...
7172
def kill(self) -> None: ...
7273
def alive(self) -> bool: ...
73-
def groups(self) -> list[_Group]: ...
74+
def groups(self) -> list[_TGroup]: ...
7475

7576
# also a protocol
76-
class _SupportsDirtySprite(_SupportsSprite, Protocol):
77+
class _SupportsDirtySprite(_SupportsSprite[_TGroup], Protocol):
7778
dirty: int
7879
blendmode: int
7980
source_rect: Union[FRect, Rect]
@@ -83,7 +84,7 @@ class _SupportsDirtySprite(_SupportsSprite, Protocol):
8384
def _get_visible(self) -> int: ...
8485

8586
# concrete sprite implementation class
86-
class Sprite(_SupportsSprite):
87+
class Sprite(_SupportsSprite[_TGroup]):
8788
@property
8889
def image(self) -> Optional[Surface]: ...
8990
@image.setter
@@ -96,18 +97,18 @@ class Sprite(_SupportsSprite):
9697
def layer(self) -> int: ...
9798
@layer.setter
9899
def layer(self, value: int) -> None: ...
99-
def __init__(self, *groups: _Group) -> None: ...
100-
def add_internal(self, group: _Group) -> None: ...
101-
def remove_internal(self, group: _Group) -> None: ...
100+
def __init__(self, *groups: _TGroup) -> None: ...
101+
def add_internal(self, group: _TGroup) -> None: ...
102+
def remove_internal(self, group: _TGroup) -> None: ...
102103
def update(self, *args: Any, **kwargs: Any) -> None: ...
103-
def add(self, *groups: _Group) -> None: ...
104-
def remove(self, *groups: _Group) -> None: ...
104+
def add(self, *groups: _TGroup) -> None: ...
105+
def remove(self, *groups: _TGroup) -> None: ...
105106
def kill(self) -> None: ...
106107
def alive(self) -> bool: ...
107-
def groups(self) -> list[_Group]: ...
108+
def groups(self) -> list[_TGroup]: ...
108109

109110
# concrete dirty sprite implementation class
110-
class DirtySprite(_SupportsDirtySprite):
111+
class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]):
111112
dirty: int
112113
blendmode: int
113114
source_rect: Union[FRect, Rect]

src_py/sprite.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class Sprite:
109109
110110
"""
111111

112+
__class_getitem__ = classmethod(types.GenericAlias)
113+
112114
def __init__(self, *groups):
113115
self.__g = {} # The groups the sprite is in
114116
self.__image: Optional[pygame.surface.Surface] = None

0 commit comments

Comments
 (0)