Source code for pokercore.card

from pokercore.exceptions import (CardCreationError,
                                  CardArithmeticError, CardComparisonError)


[docs]class Card(object): """Class representing a playing card. A playing card consists of two integers, passed to the constructor during instantiation: * rank - the rank of the card [0-12] * suit - the suit of the card [0-3] A Card can be compared to, added to, subtracted to and subtracted by other Card objects and integers (using their ranks, resulting in plain integers). For identity check, the identical_to method is provided. """ ranks = ('2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A') suits = ('c', 'd', 'h', 's') def __init__(self, rank, suit): if rank not in xrange(13): raise CardCreationError('card rank must lie between ' '0 and 12, inclusive') if suit not in xrange(4): raise CardCreationError('card suit must lie between ' '0 and 3, inclusive') self.rank = rank self.suit = suit def __repr__(self): return 'Card(%s%s)' % (self.ranks[self.rank], self.suits[self.suit]) def __add__(self, other): if isinstance(other, int): return self.rank + other if isinstance(other, Card): return self.rank + other.rank raise CardArithmeticError('cards can only be added ' 'to cards and integers') __radd__ = __add__ def __sub__(self, other): if isinstance(other, int): return self.rank - other if isinstance(other, Card): return self.rank - other.rank raise CardArithmeticError('cards can only be subtracted ' 'by cards and integers') def __rsub__(self, other): if isinstance(other, int): return other - self.rank if isinstance(other, Card): return other.rank - self.rank raise CardArithmeticError('cards can only subtract ' 'cards and integers') def __cmp__(self, other): if isinstance(other, Card): return cmp(self.rank, other.rank) if isinstance(other, int): return cmp(self.rank, other) raise CardComparisonError('cards can only be compared ' 'to cards and integers')
[docs] def identical_to(self, other): if not isinstance(other, Card): raise CardComparisonError('cannot identity-check card ' 'with non-card') return (self.rank, self.suit) == (other.rank, other.suit)
[docs] @classmethod def from_chars(cls, chars): """return a new object from a pair of character symbols""" try: if len(chars) != 2: raise CardCreationError('invalid card symbols') rank = chars[0].upper() suit = chars[1].lower() return cls(cls.ranks.index(rank), cls.suits.index(suit)) except (TypeError, AttributeError, ValueError): raise CardCreationError('invalid card symbols')