Как напечатать колоду карт в удобочитаемом виде с помощью Python - PullRequest
0 голосов
/ 17 октября 2019

Я создаю колоду карт в виде списка и мне нужно распечатать колоду. Однако, когда я пытаюсь напечатать колоду, она возвращает идентификатор объекта, а не что-то читаемое.

Обратите внимание, код здесь неполный. Класс колоды должен взять входной масть и вернуть карты 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A для этой масти. По умолчанию должна возвращаться полная колода из 52 карт. Тем не менее, я еще не нашел способ сделать по умолчанию все костюмы. В настоящее время значение по умолчанию сохраняется как пики в качестве заполнителя.

Я пытался использовать функции str и repr , но, похоже, это не имеет значения. Я также не получаю сообщение об ошибке при попытке реализовать функцию repr , поэтому я предполагаю, что не ошибаюсь в синтаксисе или чем-то еще.

from random import shuffle

# possible errors
class Error(Exception):
   """Base class for other exceptions"""
   pass
class RankError(Error):
    """Raised when input rank is not a valid card rank"""
    pass
class SuitError(Error):
   """Raised when input rank is not a valid card suit"""
   pass
class NoCardsError(Error):
    """Raised when deck does not have enough cards to deal"""
    pass

all_rank = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
all_suit = ["♠", "♥", "♦", "♣"] 
hand = []

class PlayingCard:
    def __init__(self, rank, suit):
        if str(rank) not in all_rank:
            raise RankError("Invalid rank! Rank must be 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, or A")
        if suit not in all_suit:
            raise SuitError("Invalid suit! Suit must be ♠, ♥, ♦, or ♣")
        self.rank = rank
        self.suit = suit
    def __str__(self):
        return str(self.rank) + " of " + str(self.suit)

class Deck:
    def __init__(self, suit = "♠"): # current default is spades, need to think of way to make default all the suits
        self.cards = [PlayingCard(rank, suit) for rank in all_rank]

    def __repr__(self):
        return "%r of %r" % (self.rank, self.suit)

    def shuffle_deck():
        self.shuffled_cards = random.shuffle(self.cards)

    def deal_card(card_count):
        if card_count > len(cards):
            raise NoCardsError("Not enough cards in the deck to deal.")
        else:
            hand = hand.append(cards.pop())
            return hand


deck1 = Deck()
print(deck1.cards)

Я ожидаю, что вывод списка будет выглядеть как

[2 из ♠, 3 из of, 4 из of, 5 из of, 6 из ♠ и т. Д.]

но фактический вывод равен

[<<strong> main .PlayingCard объект в 0x000001BE6C17EDD8>, <<strong> main .PlayingCard объект в 0x000001BE6C17EB38>, <<strong> main .PlayingCard объект в 0x000001BE6C17E748>, <<strong> main .PlayingCard объект в 0x000001BE6C17E198>, <<strong> main .PlayingCard объект в 0x000001BE6C17E400>, <* 1031C. объект по адресу 0x000001BE6C17E6A0>, <<strong> main .PlayingCard, объект по адресу 0x000001BE6C17EE80>, <<strong> main .PlayingCard, объект по адресу 0x000001BE6C17E470>, <<strong> main * 10ard000EB 0E637EB. <<strong> main .PlayingCard объект в 0x000001BE6C17EEB8>, <<strong> main .PlayingCard объект в 0x000001BE6C17E160>, <<strong> main .PlayingCard объект в 0x000001BE6C17E35 .PlayingCard объект в 0x000001BE6C17EF98>]

1 Ответ

0 голосов
/ 17 октября 2019

Чтобы распечатать раскрыть странную запись объекта, попробуйте вставить определение __repr__ в класс PlayingCard

Например:

class PlayingCard:
    def __init__(self, rank, suit):
        if str(rank) not in all_rank:
            raise RankError("Invalid rank! Rank must be 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, or A")
        if suit not in all_suit:
            raise SuitError("Invalid suit! Suit must be ♠, ♥, ♦, or ♣")
        self.rank = rank
        self.suit = suit
    def __str__(self):
        return str(self.rank) + " of " + str(self.suit)

    # ADDITION HERE
    def __repr__(self):
        return "%r of %r" % (self.rank, self.suit)

Итак, работаетprint(deck1.cards) выведет

['2' of '♠', '3' of '♠', '4' of '♠', '5' of '♠', '6' of '♠', '7' of '♠', '8' of '♠', '9' of '♠', '10' of '♠', 'J' of '♠', 'Q' of '♠', 'K' of '♠', 'A' of '♠']

Чтобы напечатать всю колоду , вам необходимо обновить определение __init__ для класса Deck.

def __init__(self, suit = all_suit):
    self.cards = [PlayingCard(rank, one_suit) for rank in all_rank
                                              for one_suit in suit]

Снова запустив print(deck1.cards), он напечатает следующее.

['2' of '♠', '2' of '♥', '2' of '♦', '2' of '♣', '3' of '♠', '3' of '♥', '3' of '♦', '3' of '♣', '4' of '♠', '4' of '♥', '4' of '♦', '4' of '♣', '5' of '♠', '5' of '♥', '5' of '♦', '5' of '♣', '6' of '♠', '6' of '♥', '6' of '♦', '6' of '♣', '7' of '♠', '7' of '♥', '7' of '♦', '7' of '♣', '8' of '♠', '8' of '♥', '8' of '♦', '8' of '♣', '9' of '♠', '9' of '♥', '9' of '♦', '9' of '♣', '10' of '♠', '10' of '♥', '10' of '♦', '10' of '♣', 'J' of '♠', 'J' of '♥', 'J' of '♦', 'J' of '♣', 'Q' of '♠', 'Q' of '♥', 'Q' of '♦', 'Q' of '♣', 'K' of '♠', 'K' of '♥', 'K' of '♦', 'K' of '♣', 'A' of '♠', 'A' of '♥', 'A' of '♦', 'A' of '♣']

И еще раз проверим, сколько у нас:

print(len(deck1.cards))  # 52
...