@Васил функцията StandardDeck()
ще върне list който ще бъде сравняван в тестовете, repr не е от значение.
Трета задача
Мисля че има объркани Unit-tests
aos = Card(RANKS["Ace"], SUITS["Spades"]) self.assertEqual(aos.rank, RANKS["Ace"]()) self.assertEqual(aos.suit, SUITS["Spades"]())
aos.rank
е самият клас.RANKS["Ace"]()
би направило конкретен обект от този клас, при което Assert-a фейлва. същото важи и за вторият ред. Когато се остави с:self.assertEqual(aos.rank, RANKS["Ace"]) self.assertEqual(aos.suit, SUITS["Spades"])
трябва да работи коректно теста.
Също така:
self.assertIsInstance(aos.rank, RANKS["Ace"]) self.assertIsInstance(aos.suit, SUITS["Spades"])
дава:
AssertionError: <class 'solution.Ace'> is not an instance of <class 'solution.Ace'>
трябва да се промени на:
self.assertIsInstance(aos.rank(), RANKS["Ace"]) self.assertIsInstance(aos.suit(), SUITS["Spades"])
така ще бъде създаден обект от класа на ранга/боята на картата и ще се провери дали е инстанция на даденият клас.
Примерният тест в github е верен. В условието пише:
Конструктура на Card приема клас rank и suit (не тяхна инстанция). Класът е непроменяем (immutable). Например:
>>> aos = Card(RANKS["Ace"], SUITS["Spades"]) >>> aos.rank <__main__.Ace object at 0x7f2632ed5890>
По стандарта
PEP8
не трябва ли функциитеStandardDeck() BeloteDeck() SixtySixDeck()
да са "lowercase with words separated by underscores", т.е.standard_deck() belote_deck() sixty_six_deck()
Аха, значи конструктора приема самият клас, и записва в self.rank и self.suit инстанция на съответните класове? Аз съм го направил да записва самият клас (тоест self.rank = rank в конструктора, явно не съм разбрал условието)
@Васил, Цветелина ти е отговорила. Една вметка не по задачата, разгледай малко как работи Markdown, редактирах ти поста, понеже беше много тегав за четене.
@Петър, има добро обяснение за това защо функции не са кръстени като функции. Не искам за сега да ви отнемам удоволствието да се досетите сами. :)
Защото връщат обекти от custom клас ?
Според мене на тях може да се гледа като специален конструктор на CardCollection.
Струва ми се че нещо не е наред с произволното генериране на карти в примерните тестове. Като си тествам add селската си работи перфектно, но ако пусна тестовете ми забива. Пробвах да закоментирам частта където се използва генератора и всичко си е наред. А какъв точно е евентуалният проблем не знам.
Edit: Може ли да има повтарящи карти в CardCollection? От условието за мене излиза, че може, защо тогава да не се използва лист за генератора, вместо сет?
В тестовете за
self.assertIsInstance(aos.rank, RANKS["Ace"])
какво поведение да очакваме? Все пакaos.rank
не е обект, а клас. Тогава няма как да очаквамеaos.rank
да е инстанция на класаAce
? Същото важи и заself.assertIsInstance(aos.suit, SUITS["Spades"])
. Този тест трябва да излгежда така:self.assertIsInstance(aos.rank(), RANKS["Ace"])
иself.assertIsInstance(aos.suit(), SUITS["Spades"])
.Подобна грешка има и в следните два теста
self.assertEqual(aos.rank, RANKS["Ace"]())
self.assertEqual(aos.suit, SUITS["Spades"]())
?Те би трябвало да изглеждат така:
self.assertEqual(aos.rank(), RANKS["Ace"]())
self.assertEqual(aos.suit(), SUITS["Spades"]())
@Емилиан
CardCollection
може да съдържа повтарящи се карти -- т.е. е катоlist
, а не катоset
. Поведението наrandom_card
е бе https://github.com/fmi/python-homework/commit/8fec1fd992c77d1826d3b51771e7f1bc92c50e20 защото предизвикваше грешка когато се паднат две еднакви карти в един тест. Той може да ти обясни повече@Владимир Първо, малка забележка по терминологията ти -- всичко в Питон е обект. Класовете са обекти които могат да имат инстанции.
Прав си, че няма как aos.rank да е инстанция на Ace ако му подаваш клас и този клас никъде не го инстанцираш. Има обаче начин да му направиш инстанция. Помисли малко по въпроса. Тестовете са верни.
Въпроса е дали трябва да му се прави инстанция, според примерите в условието на задачата:
>>> aos.rank
<main.Ace object at 0x7f2632ed5890>
>>> aos.suit
<main.Spades object at 0x7f2632ed5950>
Това поведение на предефинарано
repr
ли се дължи? Защото ако rank/suit са инстанции, при печатането им(поне с print) не трябва ли резултата да е следния:print(aos.rank)
Ace
print(aos.suit)
Spades
Използвай
repr(aos.rank)
за да получиш резултат като в конзолата. В примерното ми решение не съм дефинирал__repr__
наRank
,Suit
. Т.е. използвани са тези по подразбиране. Ето ти малко код от конзолата, дано ти илюстрира идеята правилно:>>> aos.rank <__main__.Ace object at 0x7f44d2b36ad0> >>> aos.rank.__class__ <class '__main__.Ace'> >>> RANKS["Ace"] <class '__main__.Ace'>
И така. Трябва да му се прави инстанция и това го пише и в условието.
RANKS["Ace"] () метод ли е,и ако да-как речниците имат методи и какво трябва да изведе,на мен ми дава грешка,а RANKS["Ace"] ми извежда "class 'main.Ace'",аз ли бъркам нещо?
Както се вижда в горния пример даден от @Людмил
>>> RANKS["Ace"] <class '__main__.Ace'>
Въобще не е нормално да връща грешка
RANKS['Ace']()
,а трябва да създава инстанция на класа
Ace
. Еквивалентно е наAce()
.Не,
RANKS["Ace"]
не е метод!RANKS е речник -- ключовете му са низове (имената на класовете), а стойностите му са класове. За това
RANKS["Ace"]()
е същото катоAce()
-- инстанция на класаAce
.Как трябва да са подредени картите в стандартното тесте, SUITS.keys() е казано, че са:
dict_keys(['Diamonds', 'Hearts', 'Spades', 'Clubs']) StandardDeck(): dict_keys(['Diamonds', 'Clubs','Hearts', 'Spades' ]). Последователността на боите ме интересува при SUITS и StandardDeck дали е различна или е грешно на примера?
SUITS
е речник и това, което са показали като пример е съвсем случайна наредба. В тестетата подредбата е Diamonds, Clubs, Hearts, Ace(каро, спатия, купа, пика).Спам
Ham
От
test_deck_add
теста да разбираме ли, че по подразбиранеcollection
в конструктора наCardCollection
е празна колекция?@Никола Трябва да е празна колекция няма как да е друго. Мисля че идеята на тази част от тестовете е да ни поцетят че трябва да работи и в случай.
collection
ли трябва да се мутира или се предполага да се направи копие и върху него да работиCardCollection
?@Димитър Трендафилов, „поцетят“?
My eyes...
@Марио Даскалов, по-скоро второто.
@Моника, Димитър е имал предвид ,,подсетят'' и е очевидно, че е грешка при писане : )
Прочетете внимателно как се очаква да бъдат подредени колекциите карти по условие
StandardDeck() трябва да връща лист от стрингове с имената на картите като е показано или лист от обекти на картите?
StandardDeck() [ < Card King of Diamonds >, < Card Queen of Diamonds >, < Card Jack of Diamonds >, .... или [< main.Card object at 0x02D1C2F0 >, < main.Card object at 0x02F708F0 >,....
@Кирил List от обекти, на примера е така защото са променили repr -то на class Card, а и нямаше да е особено четимо(пише го по-горе във форума).
deck = CardCollection()
това е цитат от тестовете и не ми става ясно как работи като не приемаcollection
.
Трябва да сте влезли в системата, за да може да отговаряте на теми.