Найти - Пользователи
Полная версия: Аннотация типов. Как правильно поступить?
Начало » Python для новичков » Аннотация типов. Как правильно поступить?
1
tathagata
Пишу настольную игру. Редактор - 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. Но, возможно, я выбрал не совсем правильный подход при проектировании структуры классов. Предполагая, что ситуация, с которой я столкнулся, вполне себе типичная, прошу посоветовать, как мне правильнее сделать, чтобы я мог в коде вызывать методы фигур из клеток, при этом зная, что клетки могут быть также и пустыми. Повторю, что с точки зрения безопасности я делаю предварительные проверки, везде, где использую эти методы (свойства).
py.user.next
Попробуй для начала убрать одинаковые имена у setup(). Не пользуешься первым - закомментируй его.

tathagata
Pylance ругается
Он может быть написан на коленке и он может подумать из-за этого, что там метод setup() один и взять его, а содержимое двух методов setup() склеить воедино как строки одного тела метода. Что угодно там может быть.

Попробуй также уменьшить это всё до минимального примера в каком-нибудь новом проекте пустом и повторить ситуацию с проверкой на None, чтобы узнать, умеет Pylance определять такие проверки или не умеет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB