Решение на От ливадите до Лас Вегас (и назад) от Виктор Христов
Резултати
- 2 точки от тестове
- 0 бонус точки
- 2 точки общо
- 3 успешни тест(а)
- 12 неуспешни тест(а)
Код
Лог от изпълнението
EEFFE...EEEEEEE
======================================================================
ERROR: test_correct_deck_init (test.TestBelot)
Test initialization with correct deck.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'deck' is not defined
======================================================================
ERROR: test_correct_direction_and_players_deal (test.TestBelot)
Test dealing with correct direction and players.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'deck' is not defined
======================================================================
ERROR: test_cutting_deck (test.TestDeck)
Test cutting a deck.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
TypeError: slice indices must be integers or None or have an __index__ method
======================================================================
ERROR: test_collecting_cards_before_dealing (test.TestGame)
Test collecting the cards before a new deal.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'players' is not defined
======================================================================
ERROR: test_dealing_ltr (test.TestGame)
Test dealing the cards left to right.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'players' is not defined
======================================================================
ERROR: test_dealing_rtl (test.TestGame)
Test dealing the cards right to left.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'players' is not defined
======================================================================
ERROR: test_players_creation (test.TestGame)
Test creation and retrieval of players.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'players' is not defined
======================================================================
ERROR: test_prepare_deck (test.TestGame)
Test preparing the deck for dealing.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'players' is not defined
======================================================================
ERROR: test_correct_deck_init (test.TestPoker)
Test initialization with correct deck.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'deck' is not defined
======================================================================
ERROR: test_correct_direction_and_players_deal (test.TestPoker)
Test dealing with correct direction and players.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
NameError: name 'deck' is not defined
======================================================================
FAIL: test_get_face (test.TestCard)
Test the get_face method.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'spades' != 'A'
- spades
+ A
======================================================================
FAIL: test_get_suit (test.TestCard)
Test the get_suit method.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'A' != 'spades'
- A
+ spades
----------------------------------------------------------------------
Ran 15 tests in 0.199s
FAILED (failures=2, errors=10)
История (2 версии и 11 коментара)
Виктор обнови решението на 10.11.2022 20:05 (преди почти 3 години)
Бих използвал protected имена на атрибути като тези, които не използваш извън класа - self._suit
Когато дефинираш стойност по подразбиране на атрибут, прието е да няма интервали:
def __init__(self, face_filter=DEFAULT_FACE_FILTER):
Супер е, че виждам генератор! Но не мисля, че е добра идея той да бъде дефиниран в __init__ - по-добре е да се метод на класа, защото:
1) По-четимо е;
2) Достъпен е и за други потенциални клиенти;
Можеш да го дефинираш като staticmethod, тъй като той не изисква инстанция.
Освен това би си спестил цикъла по-долу, ако го преправиш да инстанцира карти:
@staticmethod
def deck_generator(faces, suits):
for face in faces:
for suit in suits:
yield Card(face, suit)
def __init__(self, face_filter=DEFAULT_FACE_FILTER):
self.cards = list(self.deck_generator(face_filter, SUITS))
ПП: не съм го тествал, пиша наизуст, но е нещо такова...
Бих използвал някакъв случаен елемент при цепене, а не винаги средата, но това не е нещо, за което ще тестваме, така че и това е валидно. Просто е предвидимо, ако говорим за истинска игра.
Не трябва да раздаваш случайни карти, а карти, които са най-отгоре на тестето.
ПП: Никъде не е казано кое е отгоре, и кое е отдолу, така че просто и двете интерпретации са валидни, но трябва да взимаш карти само от единия края.
Интересен начин да кажеш for _ in range(card_count).
Тук презаписваш списъка всеки път. Реално връщаш една карта, а не няколко.
deck = Deck() ще се евалюира само веднъж - при дефинирането на класа ти. Т.е този клас ще работи само при една инстанция. Повече инстанции ще го счупят, защото ще споделят едно и също тесте.
class Deck:
pass
class Game:
def set_deck(self, deck=Deck()):
self.deck = deck
game1 = Game()
game1.set_deck()
game2 = Game()
game2.set_deck()
print(game1.deck is game2.deck) # True
deck не е достъпно в този контекст. Може би си имал предвид self.deck.
Виждам и други подобни из кода, но няма да ги отбелязвам изрично.
NameError: players is not defined
Поизтествай си кода. Оставих някоколко коментара за грешки, които забелязах, но е възможно да има и още.

Бих използвал protected имена на атрибути като тези, които не използваш извън класа -
self._suitКогато дефинираш стойност по подразбиране на атрибут, прието е да няма интервали:
Супер е, че виждам генератор! Но не мисля, че е добра идея той да бъде дефиниран в
__init__- по-добре е да се метод на класа, защото:1) По-четимо е;
2) Достъпен е и за други потенциални клиенти;
Можеш да го дефинираш като staticmethod, тъй като той не изисква инстанция.
Освен това би си спестил цикъла по-долу, ако го преправиш да инстанцира карти:
ПП: не съм го тествал, пиша наизуст, но е нещо такова...
Бих използвал някакъв случаен елемент при цепене, а не винаги средата, но това не е нещо, за което ще тестваме, така че и това е валидно. Просто е предвидимо, ако говорим за истинска игра.
Не трябва да раздаваш случайни карти, а карти, които са най-отгоре на тестето.
ПП: Никъде не е казано кое е отгоре, и кое е отдолу, така че просто и двете интерпретации са валидни, но трябва да взимаш карти само от единия края.
Интересен начин да кажеш
for _ in range(card_count).Тук презаписваш списъка всеки път. Реално връщаш една карта, а не няколко.
deck = Deck()ще се евалюира само веднъж - при дефинирането на класа ти. Т.е този клас ще работи само при една инстанция. Повече инстанции ще го счупят, защото ще споделят едно и също тесте.deckне е достъпно в този контекст. Може би си имал предвидself.deck.Виждам и други подобни из кода, но няма да ги отбелязвам изрично.
NameError: players is not defined