Въпроси?
Шеста задача
- Публикувано преди
Какво се има в предид с "
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
Публикувано преди-
Здравейте,
искам да попитам при следния пример
spam.eggs(1.0, 1.0) # 1
не трябва ли да върне 5, защотото и двата аргумента са от тип флоат или аз се бъркам нещо :)
Публикувано предиВ примерния тест (функцията
test_invoking_with_a_subclass
) дали не трябва да се проверяваself.assertEqual('object', Spam().eggs(12))
вместо
self.assertEqual('object', Spam.eggs(12))
Публикувано предиТрябва ли да гледаме
defaults
,kwonlyargs
иkwonlydefaults
?Публикувано преди@Александър:
Прав си за грешките в условието.
testArgs(5, 6, 18, z = 25)
се предполага да работи.testArgs(5, y = 25, x = 24)
го пробвай в конзолата и виж какво става.Възможно е метода, който декорираме, да има
*args
и**kwargs
, но те не се вземат предвид за dispatch-а. Ако по тях има анотации може или да ги игнорирате или да дадете грешка. Същото важи и заself
.@Никола:
Всъщност, трябва да връща 4, понеже
(object, object)
идва преди(float, float)
.@Димо:
Съвършенно прав си.
Условието и теста са обновени.
Публикувано преди@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ра как би трябвало да стане?Публикувано предиОт http://docs.python.org/py3k/library/functions.html#property:
"[...]A property object has getter, setter, and deleter methods usable as decorators that create a copy of the property with the corresponding accessor function set to the decorated function. This is best explained with an example:[...]"
Нещо подобно...
Публикувано предиНе съм сигурен дали е напълно адекватен. Умувйки, схванах т'ва: http://paste.debian.net/117138/
Последният тест(този с expectedFailure) е възможно да е лоша идея.
Публикувано предиАко имаш предвид това с декорирането на клас, и според мен няма смислен резултат (поне такъв, дефиниран от условието), но пък... хм. От друга страна, това го поставя в графата "undefined behavior", тъй като в условието никъде не пише нищо за това какво се случва, ако декорираният обект не е метод - спокойно би могло да има реализация, която в такива случаи връща примерно оригиналния обект (да, лош стил на програмиране, silent failures and stuff, но все пак ще отговаря на условието). Така че конкретно това парче от теста ти може би наистина не е много добра идея :)
А иначе към Радослав - едно доста просто формулирано подсказване: в Python всичко е обект, всичко има атрибути :)
Публикувано преди@Евгени Кунев На твоя тест на 48 ред ми дава грешката: TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' В мен ли е проблемът?
EDIT: Разбрах го, аз мислех, че това трябва да работи само за методи на даден клас, а то явно е било за всякакви функции. :)
Публикувано предиОтносно: "Мултиметод може да се извика ако всичките му аргументи са инстанции на типовете в анотацията (isinstance)":
това означава ли, че или ще има анотации, които ще са типове, или няма да има анотации? В смисъл такъв, че няма да има анотации от типа: " var : 'asd' " ?
Публикувано предиБи трябвало при използване по предназначение да няма такива, но ако има мисля, че е разумно да разчиташ на т'ва какво прави isinstance(5, 'dqdo'), при положение, че пише изрично да проверяваш типа с isinstance.
@Пенчев, тестът ми със сигурност не отговаря напълно на условието, но просто ми се струва по-възпитано да се сърдиш гласно при (предвидимо) лошо използване. Чуденето ми беше по-скоро дали не е в разрез с конкретната идея за мултиметод.
Публикувано преди@Евгени - Да, аз точно това се чудех: дали може да разчитаме на държанието на isinstance или трябва да проверяваме дали анотацията е някакъв тип и ако не е, да правим още редица проверки за разни неща.
Публикувано предиРазчитайте на
isinstance
Публикувано преди@Станко и Петър
Мерси много за помощта. Още ми е мъгляво, но поне успях да измисля нещо, което е повече от тъпото гледане :)Публикувано предиОще нещо - гарантирано ли ни е, че този декоратор ще се използва само за член функции на класове? Питам заради игнорирането на self - дали да прескачаме просто първия параметър или да проверяваме дали първият аргумент не е с име self? Защото и двете не са никак добри варианти, ако декораторът ще се използва и за методи, и за функции.
10x
Публикувано предиАко искаш подсказка, хубав вариант е да връщаш descriptor. Ако го направиш така, този въпрос за
self
-а не е много належащ.Иначе, гарантирано ви е.
Публикувано предиВ дадения примерен код
@collide.multimethod def collide(self, a: Asteroid, b: Spaceship): self.collide(b, a)
не трябва ли да има един return пред self.collide(b,a)?
P.S. Ууупс, моя грешка. При опита ми да вкарам въпросния код в тестовете (и разменяйки print с return) нещата се поомазват доволно.
Публикувано предиПо принцип мога да си дефинирам декоратор @multimethod, но какво се има впредвид с: @collide.multimethod, това не го разбирам.
По нагоре имаше подобен въпрос и препрадка към линка: http://docs.python.org/py3k/library/functions.html#property
но това го използваме за да можем да дефинираме property на даден клас, каква е връзката с: @collide.multimethod?
Публикувано преди"Друг пример" има грешка :) навсякъде е multimethodS. Иначе @Димитър Денчев погледни последното изречение на @Петър Пенчев. Аз много тъпо гледах всичко докато не прочетох това :)
Публикувано предиИма два начина да го направите.
-
multimethod
връща дескриптор. Този дескриптор има атрибутmultimethod
, който работи като декоратор. -
multimethod
връща някаква функция. Тази функция има атрибутmultimethod
, който работи като декоратор.
Може да пробвате и
help(property)
. Там има сходен pattern.Публикувано преди-
Тестовете са малко, но на втория и третия моето решение падаше въпреки, че минаваше другите тестове.
Публикувано предиДобре де като се опитам да използвам декоратора по следния начин:
@collide.multimethod
ми дава "NameError: name 'collide' is not defined"
Публикувано предиЗдрасти,
Ами аз чак днеска я погледнах задачата, пък се оказва малко по сложна от предишните и ми трябва малко време за проучване. Може ли да удължите срока до края на празниците ? Предварително благодаря.
Публикувано предиХм, с двете си ръце подкрепям колегата.. (: Така и така ще има някой друг ден почивка сега.. Thanks! :)
Публикувано предиИ аз се включвам в молбата за удължаване на срока (:
Публикувано предиИ аз съм за удължаване на срока.
Публикувано предиНякой може ли да ми даде някакъв линк към примерно използване на декоратори в този си вид:
@collide.multimethod
Публикувано предиДал съм по-горе, виж property.
Публикувано предиИ аз съм за удължаване на срока. Задачата все още я мъча-мъча-мъча...
Публикувано преди
Трябва да сте влезли в системата, за да може да отговаряте на теми.