From 63a56ce66f2ef6a20c7992380e342d46bc487dac Mon Sep 17 00:00:00 2001 From: Sameer Mehra Date: Sun, 25 Apr 2021 15:09:33 -0400 Subject: [PATCH 1/3] Make deck iterable and indexable; deck methods return self --- .gitignore | 2 ++ README.md | 6 +++++ deck_of_cards/deck_of_cards.py | 35 ++++++++++++++++++++++++----- deck_of_cards/test_deck_of_cards.py | 2 +- setup.py | 2 +- source/conf.py | 2 +- source/usage.rst | 10 ++++++++- 7 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..372c13e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ + diff --git a/README.md b/README.md index c5a68bf..0c803c7 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,12 @@ deck_obj.add_deck() print(len(deck_obj.deck)) ``` +**index and iterate over a deck object** +``` +first_card = deck_obj[0] +card_names = [card.name for card in deck_obj] +``` + ### Test coverage ``` ============================= test session starts ============================= diff --git a/deck_of_cards/deck_of_cards.py b/deck_of_cards/deck_of_cards.py index c5c8d81..87921b5 100644 --- a/deck_of_cards/deck_of_cards.py +++ b/deck_of_cards/deck_of_cards.py @@ -146,6 +146,17 @@ def __init__(self): ] logging.debug("_Deck initialized_") + def __getitem__(self, index): + """ + Allows bracket notation to be used to index into self.cards + :return: Card + """ + return self.deck[index] + + def __iter__(self): + yield from self.deck + + def _deck_empty(self): """ Checks if the deck is empty @@ -168,7 +179,7 @@ def add_deck(self): ] self.deck += deck logging.debug("Deck of cards added") - return self.deck + return self def order_deck(self): """ @@ -182,7 +193,7 @@ def order_deck(self): for card in self.deck ] )) - return self.deck + return self def shuffle_deck(self): """ @@ -196,7 +207,7 @@ def shuffle_deck(self): for card in self.deck ] )) - return self.deck + return self def print_deck(self): """ @@ -215,7 +226,7 @@ def reset_deck(self): """ self.__init__() logging.debug("_Object reinitialized_") - return self.deck + return self def _give_card(self, method_name, operation): """ @@ -294,7 +305,7 @@ def add_jokers(self): joker_color = Card((4, 15)) self.deck.append(joker_bw) self.deck.append(joker_color) - return self.deck + return self def main(): @@ -333,6 +344,20 @@ def main(): deck_obj.take_card(card) print(len(deck_obj.deck)) + # deck is indexable: + print("Deck is indexable:") + print("First card is: " + deck_obj[0].name) + # deck is iterable: + print("Deck is iterable and each item is a card:") + for c in deck_obj: + if (c.rank == 1): + print(c.name) + + print("You can also do functional operations on the deck object:") + aces = filter(lambda c: c.rank == 1, deck_obj) + print([a.name for a in aces]) + + if __name__ == "__main__": main() diff --git a/deck_of_cards/test_deck_of_cards.py b/deck_of_cards/test_deck_of_cards.py index 870f71c..c80686e 100644 --- a/deck_of_cards/test_deck_of_cards.py +++ b/deck_of_cards/test_deck_of_cards.py @@ -17,7 +17,7 @@ import pytest -from deck_of_cards.deck_of_cards import Card, DeckOfCards +from deck_of_cards import Card, DeckOfCards class TestCard: diff --git a/setup.py b/setup.py index 9107879..77d0144 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="deck_of_cards", - version="0.0.10", + version="0.0.11", author="Simon LachaƮne", author_email="simonthechain@gmail.com", description="A module to create and interact with a deck of cards object", diff --git a/source/conf.py b/source/conf.py index 4d20125..77f40f1 100644 --- a/source/conf.py +++ b/source/conf.py @@ -26,7 +26,7 @@ # The short X.Y version version = '' # The full version, including alpha/beta/rc tags -release = '0.0.9' +release = '0.0.11' # -- General configuration --------------------------------------------------- diff --git a/source/usage.rst b/source/usage.rst index 5b23ec5..7afa98e 100644 --- a/source/usage.rst +++ b/source/usage.rst @@ -76,4 +76,12 @@ add a second deck of cards to the first one print(len(deck_obj.deck)) deck_obj.add_deck() - print(len(deck_obj.deck)) \ No newline at end of file + print(len(deck_obj.deck)) + +index and iterate over a deck object +------------------------------------ +.. code-block:: python + :emphasize-lines: 2 + + first_card = deck_obj[0] + card_names = [card.name for card in deck_obj] From 98a32a4ba9c896b2f682e3247654d3136d229c5b Mon Sep 17 00:00:00 2001 From: Sameer Mehra Date: Sun, 25 Apr 2021 15:33:32 -0400 Subject: [PATCH 2/3] update comment and whitespace --- deck_of_cards/deck_of_cards.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deck_of_cards/deck_of_cards.py b/deck_of_cards/deck_of_cards.py index 87921b5..6fb82ba 100644 --- a/deck_of_cards/deck_of_cards.py +++ b/deck_of_cards/deck_of_cards.py @@ -154,9 +154,11 @@ def __getitem__(self, index): return self.deck[index] def __iter__(self): + """ + Allows deck to be iterable + """ yield from self.deck - def _deck_empty(self): """ Checks if the deck is empty @@ -357,7 +359,5 @@ def main(): aces = filter(lambda c: c.rank == 1, deck_obj) print([a.name for a in aces]) - - if __name__ == "__main__": main() From 7d485341dc8191519b19096e6ee0bae666427d64 Mon Sep 17 00:00:00 2001 From: Sammy Mehra Date: Sun, 25 Apr 2021 22:39:35 -0400 Subject: [PATCH 3/3] add type checking to __eq__ method --- deck_of_cards/deck_of_cards.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deck_of_cards/deck_of_cards.py b/deck_of_cards/deck_of_cards.py index 6fb82ba..27733d5 100644 --- a/deck_of_cards/deck_of_cards.py +++ b/deck_of_cards/deck_of_cards.py @@ -40,7 +40,9 @@ def __eq__(self, other): :param other: other Card instance to compare :return: """ - return self.rank == other.rank and self.suit == other.suit + if isinstance(other, Card): + return self.rank == other.rank and self.suit == other.suit + return False def __lt__(self, other): """