在使用 pygame 的项目中,我使用 1.7.0 版本的 mypy 通过
--strict
选项进行静态类型检查。
我还设置了一个 GitHub 操作,以便在拉取请求期间运行 mypy,并使用以下工作流程文件:
name: Mypy
on:
pull_request:
branches: [main]
jobs:
build-linux:
runs-on: ubuntu-latest
strategy:
max-parallel: 5
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: '3.10'
- name: Add conda to system path
run: |
# $CONDA is an environment variable pointing to the root of the miniconda directory
echo $CONDA/bin >> $GITHUB_PATH
- name: Install dependencies
run: |
conda env update --file environment.yaml --name base
- name: Run static type checking
run: |
mypy --strict .
mypy 在我的本地计算机上没有显示任何问题,但在 GitHub 操作中运行时抛出这些错误:
othellia/sprites.py:46: error: Missing type parameters for generic type "Group" [type-arg]
othellia/sprites.py:102: error: Missing type parameters for generic type "Group" [type-arg]
othellia/sprites.py:164: error: Missing type parameters for generic type "Group" [type-arg]
Found 3 errors in 1 file (checked 20 source files)
Error: Process completed with exit code 1.
这里是有问题的
sprites.py
文件:
import numpy as np
import pygame
from settings.colors import (
BLACK_PIECE_COLOR,
CELL_COLOR,
ENDGAME_MESSAGE_BACKGROUND_COLOR,
ENDGAME_MESSAGE_BLACK_VICTORY_COLOR,
ENDGAME_MESSAGE_DRAW_COLOR,
ENDGAME_MESSAGE_WHITE_VICTORY_COLOR,
INDICATOR_COLOR,
WHITE_PIECE_COLOR,
)
from settings.graphics import (
BOARD_SIZE,
CELL_GAP,
CELL_SIZE,
ENDGAME_MESSAGE_SIZE,
INDICATOR_SIZE,
PIECE_SIZE,
)
from settings.values import BLACK_VALUE
class Cell(pygame.sprite.Sprite):
"""Sprite of board cell.
Args:
x (int): x-axis top-left pixel position.
y (int): y-axis top-left pixel position.
"""
def __init__(self, x: int, y: int) -> None:
super().__init__()
self.image = pygame.Surface((CELL_SIZE, CELL_SIZE))
self.image.fill(CELL_COLOR)
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
def draw(self, surface: pygame.SurfaceType) -> None:
surface.blit(self.image, self.rect)
class Board(pygame.sprite.Group):
"""Sprite group of the board."""
def __init__(self) -> None:
super().__init__()
self.init_board()
def init_board(self) -> None:
"""Initiliaze board cells position."""
for y in range(8):
for x in range(8):
self.add(
Cell(
x * CELL_SIZE + (x + 1) * CELL_GAP,
y * CELL_SIZE + (y + 1) * CELL_GAP,
)
)
class Piece(pygame.sprite.Sprite):
"""Sprite of a piece.
A piece can be black or white, depending on which player it belongs to.
Args:
row (int): row position on the board.
col (int): column position on the board.
is_black (bool): color of the piece.
"""
def __init__(self, row: int, col: int, is_black: bool) -> None:
super().__init__()
self.image = pygame.Surface((CELL_SIZE, CELL_SIZE), pygame.SRCALPHA)
pygame.draw.circle(
self.image,
color=BLACK_PIECE_COLOR if is_black else WHITE_PIECE_COLOR,
center=(
CELL_SIZE / 2,
CELL_SIZE / 2,
),
radius=PIECE_SIZE / 2,
width=0, # Fill the circle
)
self.rect = self.image.get_rect()
self.rect.topleft = (
row * CELL_SIZE + (row + 1) * CELL_GAP,
col * CELL_SIZE + (col + 1) * CELL_GAP,
)
def draw(self, surface: pygame.SurfaceType) -> None:
surface.blit(self.image, self.rect)
class PieceLayout(pygame.sprite.Group):
"""Sprite group of all the pieces on the board."""
def __init__(self) -> None:
super().__init__()
def update(self, cells: np.ndarray[np.int64, np.dtype[np.int64]]) -> None:
"""Update the piece layout according the content of all board's cells.
Args:
cells (np.ndarray[np.int64, np.dtype[np.int64]]): board's cells.
"""
self.empty()
for row in range(8):
for col in range(8):
val = cells[row, col]
# Check empty cell
if val == 0:
continue
self.add(Piece(col, row, is_black=(val == 1)))
class Indicator(pygame.sprite.Sprite):
"""Sprite of a move indicator.
Only certain moves are legal on each player's turn, notified by indicators
for more convenience.
Args:
row (int): row position on the board.
col (int): column position on the board.
"""
def __init__(self, row: int, col: int) -> None:
super().__init__()
self.image = pygame.Surface((CELL_SIZE, CELL_SIZE), pygame.SRCALPHA)
pygame.draw.circle(
self.image,
color=INDICATOR_COLOR,
center=(
CELL_SIZE / 2,
CELL_SIZE / 2,
),
radius=INDICATOR_SIZE / 2,
width=0, # Fill the circle
)
self.rect = self.image.get_rect()
self.rect.topleft = (
row * CELL_SIZE + (row + 1) * CELL_GAP,
col * CELL_SIZE + (col + 1) * CELL_GAP,
)
def draw(self, surface: pygame.SurfaceType) -> None:
surface.blit(self.image, self.rect)
class IndicatorLayout(pygame.sprite.Group):
"""Sprite group of all move indicators."""
def __init__(self) -> None:
super().__init__()
def update(
self, indicators: np.ndarray[tuple[int, int], np.dtype[np.int64]]
) -> None:
"""Update the indicator layout.
Args:
indicators (np.ndarray[tuple[int, int], np.dtype[np.int64]]): legal moves.
"""
self.empty()
for row, col in indicators:
self.add(Indicator(row, col))
class PhantomPiece(pygame.sprite.Sprite):
"""Sprite of a phantom piece.
A phantom piece is used to help the player visualize his next move by
replacing an indicator with a semi-transparent version of his piece.
Args:
row (int): row position on the board.
col (int): color position on the board.
is_black (bool): color of the piece.
"""
def __init__(self, row: int, col: int, is_black: bool) -> None:
super().__init__()
self.image = pygame.Surface((CELL_SIZE, CELL_SIZE), pygame.SRCALPHA)
pygame.draw.circle(
self.image,
color=(*BLACK_PIECE_COLOR, int(255 / 2))
if is_black
else (*WHITE_PIECE_COLOR, int(255 / 2)),
center=(
CELL_SIZE / 2,
CELL_SIZE / 2,
),
radius=PIECE_SIZE / 2,
width=0, # Fill the circle
)
self.rect = self.image.get_rect()
self.rect.topleft = (
row * CELL_SIZE + (row + 1) * CELL_GAP,
col * CELL_SIZE + (col + 1) * CELL_GAP,
)
def draw(self, surface: pygame.SurfaceType) -> None:
surface.blit(self.image, self.rect)
class EndgameMessage(pygame.sprite.Sprite):
"""Sprite of the endgame message notifying the result of the game.
Args:
player_value (int | None): value of the player who won, None if draw.
"""
def __init__(self, player_value: int | None) -> None:
super().__init__()
self.image = pygame.Surface((BOARD_SIZE, BOARD_SIZE), pygame.SRCALPHA)
self.image.fill((*ENDGAME_MESSAGE_BACKGROUND_COLOR, int(255 / 1.5)))
label = (
"DRAW"
if player_value is None
else "BLACK won"
if player_value == BLACK_VALUE
else "WHITE won"
)
label_color = (
ENDGAME_MESSAGE_DRAW_COLOR
if player_value is None
else ENDGAME_MESSAGE_BLACK_VICTORY_COLOR
if player_value == BLACK_VALUE
else ENDGAME_MESSAGE_WHITE_VICTORY_COLOR
)
font = pygame.font.SysFont("Verdana", ENDGAME_MESSAGE_SIZE, bold=True)
text = font.render(label, True, label_color)
text_rect = text.get_rect(center=(BOARD_SIZE / 2, BOARD_SIZE / 2))
self.image.blit(text, text_rect)
self.rect = self.image.get_rect()
self.rect.topleft = (0, 0)
def draw(self, surface: pygame.SurfaceType) -> None:
surface.blit(self.image, self.rect)
首先认为这是由于环境和软件包版本问题,我用所有依赖项和软件包版本更新了我的 conda
environment.yaml
:
name: othellia
channels:
- conda-forge
- defaults
dependencies:
- _libgcc_mutex=0.1=conda_forge
- _openmp_mutex=4.5=2_gnu
- alsa-lib=1.2.10=hd590300_0
- anyio=4.0.0=pyhd8ed1ab_0
- aom=3.7.0=h59595ed_0
- argon2-cffi=23.1.0=pyhd8ed1ab_0
- argon2-cffi-bindings=21.2.0=py310h2372a71_4
- arrow=1.3.0=pyhd8ed1ab_0
- asttokens=2.4.1=pyhd8ed1ab_0
- async-lru=2.0.4=pyhd8ed1ab_0
- attr=2.5.1=h166bdaf_1
- attrs=23.1.0=pyh71513ae_1
- babel=2.13.1=pyhd8ed1ab_0
- backports=1.0=pyhd8ed1ab_3
- backports.functools_lru_cache=1.6.5=pyhd8ed1ab_0
- beautifulsoup4=4.12.2=pyha770c72_0
- bleach=6.1.0=pyhd8ed1ab_0
- brotli=1.1.0=hd590300_1
- brotli-bin=1.1.0=hd590300_1
- brotli-python=1.1.0=py310hc6cd4ac_1
- bzip2=1.0.8=hd590300_5
- ca-certificates=2023.11.17=hbcca054_0
- cached-property=1.5.2=hd8ed1ab_1
- cached_property=1.5.2=pyha770c72_1
- cairo=1.18.0=h3faef2a_0
- certifi=2023.11.17=pyhd8ed1ab_0
- cffi=1.16.0=py310h2fee648_0
- charset-normalizer=3.3.2=pyhd8ed1ab_0
- colorama=0.4.6=pyhd8ed1ab_0
- comm=0.1.4=pyhd8ed1ab_0
- contourpy=1.2.0=py310hd41b1e2_0
- coverage=7.3.2=py310h2372a71_0
- cycler=0.12.1=pyhd8ed1ab_0
- dav1d=1.2.1=hd590300_0
- dbus=1.13.6=h5008d03_3
- debugpy=1.8.0=py310hc6cd4ac_1
- decorator=5.1.1=pyhd8ed1ab_0
- defusedxml=0.7.1=pyhd8ed1ab_0
- entrypoints=0.4=pyhd8ed1ab_0
- exceptiongroup=1.1.3=pyhd8ed1ab_0
- executing=2.0.1=pyhd8ed1ab_0
- expat=2.5.0=hcb278e6_1
- fluidsynth=2.3.4=h7741c18_0
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
- font-ttf-inconsolata=3.000=h77eed37_0
- font-ttf-source-code-pro=2.038=h77eed37_0
- font-ttf-ubuntu=0.83=hab24e00_0
- fontconfig=2.14.2=h14ed4e7_0
- fonts-conda-ecosystem=1=0
- fonts-conda-forge=1=0
- fonttools=4.44.3=py310h2372a71_0
- fqdn=1.5.1=pyhd8ed1ab_0
- freetype=2.12.1=h267a509_2
- gettext=0.21.1=h27087fc_0
- glib=2.78.1=hfc55251_1
- glib-tools=2.78.1=hfc55251_1
- gmp=6.3.0=h59595ed_0
- graphite2=1.3.13=h58526e2_1001
- gst-plugins-base=1.22.7=h8e1006c_0
- gstreamer=1.22.7=h98fc4e7_0
- harfbuzz=8.3.0=h3d44ed6_0
- icu=73.2=h59595ed_0
- idna=3.4=pyhd8ed1ab_0
- importlib-metadata=6.8.0=pyha770c72_0
- importlib_metadata=6.8.0=hd8ed1ab_0
- importlib_resources=6.1.1=pyhd8ed1ab_0
- iniconfig=2.0.0=pyhd8ed1ab_0
- ipykernel=6.26.0=pyhf8b6a83_0
- ipython=8.17.2=pyh41d4057_0
- ipywidgets=8.1.1=pyhd8ed1ab_0
- isoduration=20.11.0=pyhd8ed1ab_0
- jack=1.9.22=h7c63dc7_2
- jedi=0.19.1=pyhd8ed1ab_0
- jinja2=3.1.2=pyhd8ed1ab_1
- json5=0.9.14=pyhd8ed1ab_0
- jsonpointer=2.4=py310hff52083_3
- jsonschema=4.20.0=pyhd8ed1ab_0
- jsonschema-specifications=2023.11.1=pyhd8ed1ab_0
- jsonschema-with-format-nongpl=4.20.0=pyhd8ed1ab_0
- jupyter=1.0.0=pyhd8ed1ab_10
- jupyter-lsp=2.2.0=pyhd8ed1ab_0
- jupyter_client=8.6.0=pyhd8ed1ab_0
- jupyter_console=6.6.3=pyhd8ed1ab_0
- jupyter_core=5.5.0=py310hff52083_0
- jupyter_events=0.9.0=pyhd8ed1ab_0
- jupyter_server=2.10.1=pyhd8ed1ab_0
- jupyter_server_terminals=0.4.4=pyhd8ed1ab_1
- jupyterlab=4.0.9=pyhd8ed1ab_0
- jupyterlab_pygments=0.2.2=pyhd8ed1ab_0
- jupyterlab_server=2.25.2=pyhd8ed1ab_0
- jupyterlab_widgets=3.0.9=pyhd8ed1ab_0
- keyutils=1.6.1=h166bdaf_0
- kiwisolver=1.4.5=py310hd41b1e2_1
- krb5=1.21.2=h659d440_0
- lame=3.100=h166bdaf_1003
- lcms2=2.15=hb7c19ff_3
- ld_impl_linux-64=2.40=h41732ed_0
- lerc=4.0.0=h27087fc_0
- libavif16=1.0.2=hed45d22_0
- libblas=3.9.0=19_linux64_openblas
- libbrotlicommon=1.1.0=hd590300_1
- libbrotlidec=1.1.0=hd590300_1
- libbrotlienc=1.1.0=hd590300_1
- libcap=2.69=h0f662aa_0
- libcblas=3.9.0=19_linux64_openblas
- libclang=15.0.7=default_h7634d5b_3
- libclang13=15.0.7=default_h9986a30_3
- libcups=2.3.3=h4637d8d_4
- libdb=6.2.32=h9c3ff4c_0
- libdeflate=1.19=hd590300_0
- libedit=3.1.20191231=he28a2e2_2
- libevent=2.1.12=hf998b51_1
- libexpat=2.5.0=hcb278e6_1
- libffi=3.4.2=h7f98852_5
- libflac=1.4.3=h59595ed_0
- libgcc-ng=13.2.0=h807b86a_3
- libgcrypt=1.10.2=hd590300_0
- libgfortran-ng=13.2.0=h69a702a_3
- libgfortran5=13.2.0=ha4646dd_3
- libglib=2.78.1=h783c2da_1
- libgomp=13.2.0=h807b86a_3
- libgpg-error=1.47=h71f35ed_0
- libiconv=1.17=h166bdaf_0
- libjpeg-turbo=3.0.0=hd590300_1
- liblapack=3.9.0=19_linux64_openblas
- libllvm15=15.0.7=h5cf9203_3
- libmad=0.15.1b=h0b41bf4_1001
- libnsl=2.0.1=hd590300_0
- libogg=1.3.4=h7f98852_1
- libopenblas=0.3.24=pthreads_h413a1c8_0
- libopus=1.3.1=h7f98852_1
- libpng=1.6.39=h753d276_0
- libpq=16.1=hfc447b1_0
- libsndfile=1.2.2=hc60ed4a_1
- libsodium=1.0.18=h36c2ea0_1
- libsqlite=3.44.0=h2797004_0
- libstdcxx-ng=13.2.0=h7e041cc_3
- libsystemd0=254=h3516f8a_0
- libtiff=4.6.0=ha9c0a0a_2
- libuuid=2.38.1=h0b41bf4_0
- libvorbis=1.3.7=h9c3ff4c_0
- libwebp-base=1.3.2=hd590300_0
- libxcb=1.15=h0b41bf4_0
- libxkbcommon=1.6.0=h5d7e998_0
- libxml2=2.11.6=h232c23b_0
- libzlib=1.2.13=hd590300_5
- lz4-c=1.9.4=hcb278e6_0
- markupsafe=2.1.3=py310h2372a71_1
- matplotlib=3.8.1=py310hff52083_0
- matplotlib-base=3.8.1=py310h62c0568_0
- matplotlib-inline=0.1.6=pyhd8ed1ab_0
- mistune=3.0.2=pyhd8ed1ab_0
- mpg123=1.32.3=h59595ed_0
- munkres=1.1.4=pyh9f0ad1d_0
- mypy=1.7.0=py310h2372a71_0
- mypy_extensions=1.0.0=pyha770c72_0
- mysql-common=8.0.33=hf1915f5_6
- mysql-libs=8.0.33=hca2cd23_6
- nbclient=0.8.0=pyhd8ed1ab_0
- nbconvert=7.11.0=pyhd8ed1ab_0
- nbconvert-core=7.11.0=pyhd8ed1ab_0
- nbconvert-pandoc=7.11.0=pyhd8ed1ab_0
- nbformat=5.9.2=pyhd8ed1ab_0
- ncurses=6.4=h59595ed_2
- nest-asyncio=1.5.8=pyhd8ed1ab_0
- notebook=7.0.6=pyhd8ed1ab_0
- notebook-shim=0.2.3=pyhd8ed1ab_0
- nspr=4.35=h27087fc_0
- nss=3.94=h1d7d5a4_0
- numpy=1.26.0=py310hb13e2d6_0
- openjpeg=2.5.0=h488ebb8_3
- openssl=3.1.4=hd590300_0
- opusfile=0.12=h3358134_2
- overrides=7.4.0=pyhd8ed1ab_0
- packaging=23.2=pyhd8ed1ab_0
- pandas=2.1.3=py310hcc13569_0
- pandoc=3.1.3=h32600fe_0
- pandocfilters=1.5.0=pyhd8ed1ab_0
- parso=0.8.3=pyhd8ed1ab_0
- patsy=0.5.3=pyhd8ed1ab_0
- pcre2=10.42=hcad00b1_0
- pexpect=4.8.0=pyh1a96a4e_2
- pickleshare=0.7.5=py_1003
- pillow=10.1.0=py310h01dd4db_0
- pip=23.3.1=pyhd8ed1ab_0
- pixman=0.42.2=h59595ed_0
- pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1
- platformdirs=4.0.0=pyhd8ed1ab_0
- pluggy=1.3.0=pyhd8ed1ab_0
- ply=3.11=py_1
- portaudio=19.6.0=h7c63dc7_9
- portmidi=2.0.4=h7c63dc7_2
- prometheus_client=0.18.0=pyhd8ed1ab_1
- prompt-toolkit=3.0.41=pyha770c72_0
- prompt_toolkit=3.0.41=hd8ed1ab_0
- psutil=5.9.5=py310h2372a71_1
- pthread-stubs=0.4=h36c2ea0_1001
- ptyprocess=0.7.0=pyhd3deb0d_0
- pulseaudio-client=16.1=hb77b528_5
- pure_eval=0.2.2=pyhd8ed1ab_0
- pycparser=2.21=pyhd8ed1ab_0
- pygame=2.5.2=py310h408e605_2
- pygments=2.17.0=pyhd8ed1ab_0
- pyparsing=3.1.1=pyhd8ed1ab_0
- pyqt=5.15.9=py310h04931ad_5
- pyqt5-sip=12.12.2=py310hc6cd4ac_5
- pysocks=1.7.1=pyha2e5f31_6
- pytest=7.4.3=pyhd8ed1ab_0
- python=3.10.0=h543edf9_3_cpython
- python-dateutil=2.8.2=pyhd8ed1ab_0
- python-fastjsonschema=2.19.0=pyhd8ed1ab_0
- python-json-logger=2.0.7=pyhd8ed1ab_0
- python-tzdata=2023.3=pyhd8ed1ab_0
- python_abi=3.10=4_cp310
- pytz=2023.3.post1=pyhd8ed1ab_0
- pyyaml=6.0.1=py310h2372a71_1
- pyzmq=25.1.1=py310h795f18f_2
- qt-main=5.15.8=h82b777d_17
- qtconsole-base=5.5.1=pyha770c72_0
- qtpy=2.4.1=pyhd8ed1ab_0
- rav1e=0.6.6=he8a937b_2
- readline=8.2=h8228510_1
- referencing=0.31.0=pyhd8ed1ab_0
- requests=2.31.0=pyhd8ed1ab_0
- rfc3339-validator=0.1.4=pyhd8ed1ab_0
- rfc3986-validator=0.1.1=pyh9f0ad1d_0
- rpds-py=0.13.0=py310hcb5633a_0
- scipy=1.11.3=py310hb13e2d6_1
- sdl2=2.28.4=h77f46ba_0
- sdl2_image=2.6.3=h53e0c72_4
- sdl2_mixer=2.6.3=h8830914_1
- sdl2_ttf=2.20.2=ha14f88b_2
- seaborn=0.13.0=hd8ed1ab_0
- seaborn-base=0.13.0=pyhd8ed1ab_0
- send2trash=1.8.2=pyh41d4057_0
- setuptools=68.2.2=pyhd8ed1ab_0
- sip=6.7.12=py310hc6cd4ac_0
- six=1.16.0=pyh6c4a22f_0
- sniffio=1.3.0=pyhd8ed1ab_0
- soupsieve=2.5=pyhd8ed1ab_1
- sqlite=3.44.0=h2c6b66d_0
- stack_data=0.6.2=pyhd8ed1ab_0
- statsmodels=0.14.0=py310h1f7b6fc_2
- svt-av1=1.7.0=h59595ed_0
- terminado=0.18.0=pyh0d859eb_0
- tinycss2=1.2.1=pyhd8ed1ab_0
- tk=8.6.13=noxft_h4845f30_101
- toml=0.10.2=pyhd8ed1ab_0
- tomli=2.0.1=pyhd8ed1ab_0
- tornado=6.3.3=py310h2372a71_1
- tqdm=4.66.1=pyhd8ed1ab_0
- traitlets=5.13.0=pyhd8ed1ab_0
- types-python-dateutil=2.8.19.14=pyhd8ed1ab_0
- types-tqdm=4.66.0.4=pyhd8ed1ab_0
- typing-extensions=4.8.0=hd8ed1ab_0
- typing_extensions=4.8.0=pyha770c72_0
- typing_utils=0.1.0=pyhd8ed1ab_0
- tzdata=2023c=h71feb2d_0
- unicodedata2=15.1.0=py310h2372a71_0
- uri-template=1.3.0=pyhd8ed1ab_0
- urllib3=2.1.0=pyhd8ed1ab_0
- wcwidth=0.2.10=pyhd8ed1ab_0
- webcolors=1.13=pyhd8ed1ab_0
- webencodings=0.5.1=pyhd8ed1ab_2
- websocket-client=1.6.4=pyhd8ed1ab_0
- wheel=0.41.3=pyhd8ed1ab_0
- widgetsnbextension=4.0.9=pyhd8ed1ab_0
- xcb-util=0.4.0=hd590300_1
- xcb-util-image=0.4.0=h8ee46fc_1
- xcb-util-keysyms=0.4.0=h8ee46fc_1
- xcb-util-renderutil=0.3.9=hd590300_1
- xcb-util-wm=0.4.1=h8ee46fc_1
- xkeyboard-config=2.40=hd590300_0
- xorg-kbproto=1.0.7=h7f98852_1002
- xorg-libice=1.1.1=hd590300_0
- xorg-libsm=1.2.4=h7391055_0
- xorg-libx11=1.8.7=h8ee46fc_0
- xorg-libxau=1.0.11=hd590300_0
- xorg-libxdmcp=1.1.3=h7f98852_0
- xorg-libxext=1.3.4=h0b41bf4_2
- xorg-libxrender=0.9.11=hd590300_0
- xorg-renderproto=0.11.1=h7f98852_1002
- xorg-xextproto=7.3.0=h0b41bf4_1003
- xorg-xf86vidmodeproto=2.3.1=h7f98852_1002
- xorg-xproto=7.0.31=h7f98852_1007
- xz=5.2.6=h166bdaf_0
- yaml=0.2.5=h7f98852_2
- zeromq=4.3.5=h59595ed_0
- zipp=3.17.0=pyhd8ed1ab_0
- zlib=1.2.13=hd590300_5
- zstd=1.5.5=hfc55251_0
但是,问题仍然存在。
第二次,看到错误位于 pygame 类上,我对类似问题做了一些研究。我从 pygame 存储库中偶然发现了这个pull-request,它似乎解决了类似的问题,但对我没有多大帮助(据我能理解这些讨论)。
所以我目前陷入了这个问题,不知道是什么原因造成的。 难道是我的工作流程文件的设计方式造成的?
本地和远程环境之间的类型提示存根似乎不同。
请注意,键入文件是通过
mypy --install-types
命令单独安装的。
在运行 mypy checker 之前,您可能在 GitHub 操作中有此命令。