Similization
@Similization
В прострации

Как получить другой элемент Literal?

Есть такой класс:
from typing import Literal

class TicTacToePlayer:
    def __init__(self,
                 mark: Literal["cross", "zero"],
                 field: TicTacToeField
                 ):
        self.cells = []
        self.mark = mark
        self.field = field

у него есть поле mark, мне нужно как то отталкиваясь от того, какой mark у данного игрока, получить mark другого игрока
Как бы это по-человечески сделать?
Просто условно есть метод, который должен для игрока определить потенциально хорошие для хода поля, и анализировать нужно по полям другого игрока.
То есть получить что-то вроде, только с литералом
l = [mark1, mark2]
# при условии, что player.mark = mark2
other_player_mark = l[0 if player.mark == mark2 else 1]

Или может стоит это совсем иначе делать? Не используя литерал и подобие enum-ов
  • Вопрос задан
  • 37 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Литерал означает, что данная переменная/параметр всегда имеет одно из перечисленных значений. Так что...
other_player_mark = 'cross' if mark == 'zero' else 'zero'

Не, ты, конечно можешь извратиться...
import typing as t

Mark = t.Literal['cross', 'zero']

class TicTacToePlayer:
    def __init__(self,
                 mark: Mark,
                 field: TicTacToeField
                 ):
        self.cells = []
        self.mark = mark
        self.field = field
    
    def opposite(self, mark: Mark) -> Mark:
        values = t.get_args(Mark)
        idx = values.index(mark)
        next_idx = int(not idx)
        return t.cast(Mark, values[next_idx])

но лучше не надо!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы