Шеста задача

  1. Какво се има в предид с "self, *args и **kwargs нито се анотират, нито се вземат предвид в определянето на метода"?
    Възможно ли е метода, който декорираме да има *args и **kwargs?

    Нагледен пример:

    @multimethod
    def testArgs(x, y, *args, **kwargs): pass
    

    testArgs(5, 6, 18, z = 25) се предполага да работи нали? А какво правим при testArgs(5, y = 25, x = 24)?

    Мисля, че има няколко грешки във Друг пример:

    • @multimethods трябва да е @multimethod
    • spem.eggs(1.0, 1.0) # 1 трябва да spam.eggs(1.0, 1.0) # 1
    • spam.eggs(1.0, 1.0) # 1 трябва да е spam.eggs(1.0, 1.0) # 4, т.к. isinstance(1.0, object) е True
    Публикувано преди
  2. Здравейте,

    искам да попитам при следния пример

    spam.eggs(1.0, 1.0) # 1
    

    не трябва ли да върне 5, защотото и двата аргумента са от тип флоат или аз се бъркам нещо :)

    Публикувано преди
  3. В примерния тест (функцията test_invoking_with_a_subclass) дали не трябва да се проверява

    self.assertEqual('object', Spam().eggs(12))
    

    вместо

    self.assertEqual('object', Spam.eggs(12))
    
    Публикувано преди
  4. @Александър:

    Прав си за грешките в условието.

    testArgs(5, 6, 18, z = 25) се предполага да работи. testArgs(5, y = 25, x = 24) го пробвай в конзолата и виж какво става.

    Възможно е метода, който декорираме, да има *args и **kwargs, но те не се вземат предвид за dispatch-а. Ако по тях има анотации може или да ги игнорирате или да дадете грешка. Същото важи и за self.

    @Никола:

    Всъщност, трябва да връща 4, понеже (object, object) идва преди (float, float).

    @Димо:

    Съвършенно прав си.

    Условието и теста са обновени.

    Публикувано преди
  5. @multimethod
    def collide(self, a: Spaceship, b: Spaceship):
        print("Two spaceships")
    
    @collide.multimethod
    def collide(self, a: Spaceship, b: Asteroid):
        print("A spaceship and an asteroid")</code>
    

    Някой може ли да ми даде малко допълнителна информация за декораторите или по-точно частта с @collide.multimethod не мога да разбeра как би трябвало да стане?

    Публикувано преди
  6. Не съм сигурен дали е напълно адекватен. Умувйки, схванах т'ва: http://paste.debian.net/117138/

    Последният тест(този с expectedFailure) е възможно да е лоша идея.

    Публикувано преди
  7. Ако имаш предвид това с декорирането на клас, и според мен няма смислен резултат (поне такъв, дефиниран от условието), но пък... хм. От друга страна, това го поставя в графата "undefined behavior", тъй като в условието никъде не пише нищо за това какво се случва, ако декорираният обект не е метод - спокойно би могло да има реализация, която в такива случаи връща примерно оригиналния обект (да, лош стил на програмиране, silent failures and stuff, но все пак ще отговаря на условието). Така че конкретно това парче от теста ти може би наистина не е много добра идея :)

    А иначе към Радослав - едно доста просто формулирано подсказване: в Python всичко е обект, всичко има атрибути :)

    Публикувано преди
  8. @Евгени Кунев На твоя тест на 48 ред ми дава грешката: TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' В мен ли е проблемът?

    EDIT: Разбрах го, аз мислех, че това трябва да работи само за методи на даден клас, а то явно е било за всякакви функции. :)

    Публикувано преди
  9. Относно: "Мултиметод може да се извика ако всичките му аргументи са инстанции на типовете в анотацията (isinstance)":

    това означава ли, че или ще има анотации, които ще са типове, или няма да има анотации? В смисъл такъв, че няма да има анотации от типа: " var : 'asd' " ?

    Публикувано преди
  10. Би трябвало при използване по предназначение да няма такива, но ако има мисля, че е разумно да разчиташ на т'ва какво прави isinstance(5, 'dqdo'), при положение, че пише изрично да проверяваш типа с isinstance.

    @Пенчев, тестът ми със сигурност не отговаря напълно на условието, но просто ми се струва по-възпитано да се сърдиш гласно при (предвидимо) лошо използване. Чуденето ми беше по-скоро дали не е в разрез с конкретната идея за мултиметод.

    Публикувано преди
  11. @Евгени - Да, аз точно това се чудех: дали може да разчитаме на държанието на isinstance или трябва да проверяваме дали анотацията е някакъв тип и ако не е, да правим още редица проверки за разни неща.

    Публикувано преди
  12. Разчитайте на isinstance

    Публикувано преди
  13. @Станко и Петър
    Мерси много за помощта. Още ми е мъгляво, но поне успях да измисля нещо, което е повече от тъпото гледане :)

    Публикувано преди
  14. Още нещо - гарантирано ли ни е, че този декоратор ще се използва само за член функции на класове? Питам заради игнорирането на self - дали да прескачаме просто първия параметър или да проверяваме дали първият аргумент не е с име self? Защото и двете не са никак добри варианти, ако декораторът ще се използва и за методи, и за функции.

    10x

    Публикувано преди
  15. Ако искаш подсказка, хубав вариант е да връщаш descriptor. Ако го направиш така, този въпрос за self-а не е много належащ.

    Иначе, гарантирано ви е.

    Публикувано преди
  16. В дадения примерен код

    @collide.multimethod
    def collide(self, a: Asteroid, b: Spaceship):
        self.collide(b, a)
    

    не трябва ли да има един return пред self.collide(b,a)?

    P.S. Ууупс, моя грешка. При опита ми да вкарам въпросния код в тестовете (и разменяйки print с return) нещата се поомазват доволно.

    Публикувано преди
  17. По принцип мога да си дефинирам декоратор @multimethod, но какво се има впредвид с: @collide.multimethod, това не го разбирам.

    По нагоре имаше подобен въпрос и препрадка към линка: http://docs.python.org/py3k/library/functions.html#property

    но това го използваме за да можем да дефинираме property на даден клас, каква е връзката с: @collide.multimethod?

    Публикувано преди
  18. "Друг пример" има грешка :) навсякъде е multimethodS. Иначе @Димитър Денчев погледни последното изречение на @Петър Пенчев. Аз много тъпо гледах всичко докато не прочетох това :)

    Публикувано преди
  19. Има два начина да го направите.

    1. multimethod връща дескриптор. Този дескриптор има атрибут multimethod, който работи като декоратор.
    2. multimethod връща някаква функция. Тази функция има атрибут multimethod, който работи като декоратор.

    Може да пробвате и help(property). Там има сходен pattern.

    Публикувано преди
  20. Добре де като се опитам да използвам декоратора по следния начин:

    @collide.multimethod

    ми дава "NameError: name 'collide' is not defined"

    Публикувано преди
  21. Здрасти,

    Ами аз чак днеска я погледнах задачата, пък се оказва малко по сложна от предишните и ми трябва малко време за проучване. Може ли да удължите срока до края на празниците ? Предварително благодаря.

    Публикувано преди
  22. Хм, с двете си ръце подкрепям колегата.. (: Така и така ще има някой друг ден почивка сега.. Thanks! :)

    Публикувано преди
  23. И аз се включвам в молбата за удължаване на срока (:

    Публикувано преди
  24. И аз съм за удължаване на срока.

    Публикувано преди
  25. Някой може ли да ми даде някакъв линк към примерно използване на декоратори в този си вид:

    @collide.multimethod

    Публикувано преди
  26. И аз съм за удължаване на срока. Задачата все още я мъча-мъча-мъча...

    Публикувано преди

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