Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 13, 2023 13:48:57

tathagata
Зарегистрирован: 2023-02-13
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Аннотация типов. Как правильно поступить?

Пишу настольную игру. Редактор - 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. Но, возможно, я выбрал не совсем правильный подход при проектировании структуры классов. Предполагая, что ситуация, с которой я столкнулся, вполне себе типичная, прошу посоветовать, как мне правильнее сделать, чтобы я мог в коде вызывать методы фигур из клеток, при этом зная, что клетки могут быть также и пустыми. Повторю, что с точки зрения безопасности я делаю предварительные проверки, везде, где использую эти методы (свойства).

Офлайн

#2 Фев. 13, 2023 22:58:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9863
Репутация: +  853  -
Профиль   Отправить e-mail  

Аннотация типов. Как правильно поступить?

Попробуй для начала убрать одинаковые имена у setup(). Не пользуешься первым - закомментируй его.

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

Попробуй также уменьшить это всё до минимального примера в каком-нибудь новом проекте пустом и повторить ситуацию с проверкой на None, чтобы узнать, умеет Pylance определять такие проверки или не умеет.



Отредактировано py.user.next (Фев. 13, 2023 22:59:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version