Решение на От ливадите до Лас Вегас (и назад) от Виктор Христов
Резултати
- 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 (преди около 2 години)
Бих използвал 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