Трета задача

  1. Мисля че има объркани 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"])
    

    така ще бъде създаден обект от класа на ранга/боята на картата и ще се провери дали е инстанция на даденият клас.

  2. Примерният тест в github е верен. В условието пише:

    Конструктура на Card приема клас rank и suit (не тяхна инстанция). Класът е непроменяем (immutable). Например:

    >>> aos = Card(RANKS["Ace"], SUITS["Spades"])
    >>> aos.rank
    <__main__.Ace object at 0x7f2632ed5890>
    
  3. Аха, значи конструктора приема самият клас, и записва в self.rank и self.suit инстанция на съответните класове? Аз съм го направил да записва самият клас (тоест self.rank = rank в конструктора, явно не съм разбрал условието)

  4. @Васил, Цветелина ти е отговорила. Една вметка не по задачата, разгледай малко как работи Markdown, редактирах ти поста, понеже беше много тегав за четене.

    @Петър, има добро обяснение за това защо функции не са кръстени като функции. Не искам за сега да ви отнемам удоволствието да се досетите сами. :)

  5. Струва ми се че нещо не е наред с произволното генериране на карти в примерните тестове. Като си тествам add селската си работи перфектно, но ако пусна тестовете ми забива. Пробвах да закоментирам частта където се използва генератора и всичко си е наред. А какъв точно е евентуалният проблем не знам.

    Edit: Може ли да има повтарящи карти в CardCollection? От условието за мене излиза, че може, защо тогава да не се използва лист за генератора, вместо сет?

  6. В тестовете за 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"]())

  7. @Емилиан CardCollection може да съдържа повтарящи се карти -- т.е. е като list, а не като set. Поведението на random_card е бе https://github.com/fmi/python-homework/commit/8fec1fd992c77d1826d3b51771e7f1bc92c50e20 защото предизвикваше грешка когато се паднат две еднакви карти в един тест. Той може да ти обясни повече

    @Владимир Първо, малка забележка по терминологията ти -- всичко в Питон е обект. Класовете са обекти които могат да имат инстанции.

    Прав си, че няма как aos.rank да е инстанция на Ace ако му подаваш клас и този клас никъде не го инстанцираш. Има обаче начин да му направиш инстанция. Помисли малко по въпроса. Тестовете са верни.

  8. Въпроса е дали трябва да му се прави инстанция, според примерите в условието на задачата:

    >>> 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

  9. Използвай repr(aos.rank) за да получиш резултат като в конзолата. В примерното ми решение не съм дефинирал __repr__ на Rank, Suit. Т.е. използвани са тези по подразбиране. Ето ти малко код от конзолата, дано ти илюстрира идеята правилно:

    >>> aos.rank
    <__main__.Ace object at 0x7f44d2b36ad0>
    >>> aos.rank.__class__
    <class '__main__.Ace'>
    >>> RANKS["Ace"]
    <class '__main__.Ace'>
    

    И така. Трябва да му се прави инстанция и това го пише и в условието.

  10. Как трябва да са подредени картите в стандартното тесте, SUITS.keys() е казано, че са:

    dict_keys(['Diamonds', 'Hearts', 'Spades', 'Clubs']) StandardDeck(): dict_keys(['Diamonds', 'Clubs','Hearts', 'Spades' ]). Последователността на боите ме интересува при SUITS и StandardDeck дали е различна или е грешно на примера?

  11. StandardDeck() трябва да връща лист от стрингове с имената на картите като е показано или лист от обекти на картите?

    StandardDeck() [ < Card King of Diamonds >, < Card Queen of Diamonds >, < Card Jack of Diamonds >, .... или [< main.Card object at 0x02D1C2F0 >, < main.Card object at 0x02F708F0 >,....

Трябва да сте влезли в системата, за да може да отговаряте на теми.