Пишу настольную игру. Редактор - VS Code с Pylance. Используя аннотации типов, столкнулся с проблемой проверки.
from typing import Final, TypedDict
Square = int
EMPTY: Final = None
class Color(Enum):
"""Enum for piece colors."""
RED = True
BLUE = False
class PieceType(Enum):
"""Enum for piece types."""
FLAG = 0
MARSHAL = 1
class Piece:
"""A piece with type and color."""
def __init__(self, type: PieceType, color: Color) -> None:
self._type = type
self._color = color
@property
def type(self) -> PieceType:
"""The type of the piece."""
return self._type
@property
def color(self) -> Color:
"""The color of the piece."""
return self._color
class Board:
"""A gameboard."""
SIDE: Final = 10
SIZE: Final = SIDE * SIDE
def __init__(self) -> None:
self._squares: list[Piece | None] = [EMPTY] * Board.SIZE
def setup(self) -> None:
# Исключительно для примера.
self._squares[0] = Piece(PieceType.MARSHAL, Color.RED)
self._squares[1] = Piece(PieceType.FLAG, Color.RED)
self._squares[99] = Piece(PieceType.MARSHAL, Color.BLUE)
self._squares[98] = Piece(PieceType.FLAG, Color.BLUE)
def setup(self, square: Square) -> Color | None:
if self._squares[square] is EMPTY:
return None
else:
# А вот здесь Pylance ругается, что "color" is not a known member of "None"
return self._squares[square].color
Небольшие комментарии по коду. Есть
доска, представляющая собой список клеток (индекс - номер клетки на доске). Клетка может быть либо пустой (EMPTY = None), либо содержать фигуру (Piece). У фигур есть свойства, которые необходимо использовать. Вызов свойств (да и других методов) фигур производится безопасно, с предварительной проверкой на то, что клетка не пустая. Однако при активированной проверке типов вылезают указанные ошибки. Их смысл и причина появления мне понятны. Самый простой способ избавиться от них - это изменить значение параметра
reportOptionalMemberAccess для Pyright. Но, возможно, я выбрал не совсем правильный подход при проектировании структуры классов. Предполагая, что ситуация, с которой я столкнулся, вполне себе типичная, прошу посоветовать, как мне правильнее сделать, чтобы я мог в коде вызывать методы фигур из клеток, при этом зная, что клетки могут быть также и пустыми. Повторю, что с точки зрения безопасности я делаю предварительные проверки, везде, где использую эти методы (свойства).