Въпроси?
Седма задача
- Публикувано преди
проферява? :D
Публикувано предиПонякога се чудя дали съм невнимателен или просто неграмотен.
Публикувано предиРед 21 от примерния тест идва ли да рече, че трябва да се поражда задължително AssertionError или производни нему при проблемни ситуации? Не е ли по-добре предвид целта да си направим разни наши interface-related изключения?
Публикувано предиВсъщност, да. Не знам защо избрах точно
AssertionError
, но това искаме.Публикувано предието малко допълнение на тестовете от мене :) https://gist.github.com/aba33f60caa98bee64a3
Публикувано предиОще малко тестове: http://pastie.org/1955529
Публикувано предиСега май ще сцепя мрака с доста тъп въпрос, но все пак да питам - значи в
__new__
на метакласа си сменям__init__
на декориращия клас. В променения__init__
си получавам като параметър името на декорирания клас и си имам и методите на класът, които ще ни е interface. Обаче като тръгна да си взимам<декориран клас>.__dict__
и ми гърми сNameError
, че няма такъв клас?!? Нещо тотално съм засрал начина или?P.S името на класа е коректно. Примерно ако имам
@stack class MyStack: pass
достъпвам с
MyStack.__dict__
, но ми казва че MyStack isn't definedПубликувано предиречника на класа се намира в
__dict__
( има долни черти ама като гледам сигурно и ти така си го написал)"значи в new на метакласа си сменям init на декорирания клас" - по скоро на декориращия клас
П.С. Някой ще напише ли 1 наръчник как се форматират мнения в този форум?
Публикувано преди@Илиян Да де, същото съм написал, объркал съм се малко. Проблемът с NameError-a си стои обаче.
Публикувано предиИмах доброто желание да кажа нещо умно по въпросът на Мартин... ама не ми се получи... Интересно какво може да се окаже...
иначе минавам по тия грозни часове само за да дам: https://github.com/kunev/Python-FMI/blob/master/07/my_test.py
Публикувано преди@Мартин Асенов а защо достъпваш направо по името на класа? нали чрез
__init__
си получаваш като параметър, класа който ще имплементира интерфейса.Публикувано предиТестове: http://pastie.org/1976165
Публикувано преди- Публикувано преди
"В интерфейса може да има само публични (незапочващи с _). Ако са дефинирани други атрибути (методи, започващи с _ или не-методи), трябва да се поражда грешка."
А как процедираме с
__call__
и други подобни. Логично е за__call__
да не хвърляме изключение. По-принцип в метакласа като атрибути отиват и__module__
, а в дебъг режим се появява и__locals__
. Тях да ги игнорираме?Публикувано преди@Калоян Йовчев:
На 38 ред в
test_complains_for_defined_methods_diff_than_docstring_or_pass_in_interface
class intf3(metaclass=interface): def method1(self): return
според мен трябва да минава. Дали ще е pass или return е все едно в тоя случай, не виждам причина да се третират различно.
Публикувано преди@Станко:
По условие пише само за pass или docstring, не пише нищо за return. Така че не знам. Също така не е ясно дали ако има дефиниран
__call__
дали трябва да се игнорира или да се извежда грешка. :)Публикувано преди@Илиян:
Аз ги игнорирам. Ето и хинт (може да има и други начини):
if key[0] == '_' and key[1] != '_': return AssertionError
Предполагам, че вече ти е станало ясно. Но не знам дали има по-добър/правилен начин. Все още съм в началото на писането на задачата.
P.S. Под "не-методи" какво точно се разбира?
Публикувано предито и аз го игнорирам, само че в други езици си има интерфейс Callable, и тука този интерфейс се реализира, чрез
__call__
метода. Логично би било, поне според мене да може да се слага в интерфейс.Под не-методи се има в предвид атрибути. Примерно
class foo(metaclass=interface): a = 0
Публикувано преди@Илиян:
Мерси!
Интересно, а
__add__
и другите подобни - дали и тях трябва да броим за методи или да пускаме грешка?Публикувано предиМетод е всеки атрибут на класа, който може да бъде извикан. Не мисля, че това дава избор да решаваме какво да броим за метод и какво не. Въпросът тук по-скоро е дали да се разглеждата тези методи, тъй като започват с – и не са публични.
Публикувано предиНапротив, публични са. Подчертавките са просто naming convetion за системни атрибути и според мен трябва да може да се ползват в interface.
Публикувано предиА не е ли редно за това какво е функция(която в тялото на клас е съответно метод) да се осланяме на това, което писалите python са решили, че е функция, за което си има проверка? Така ми се вижда най-чисто, като че ли. А
__call__
(явно става с '\_') и подобните 'системни' методи по-скоро могат да се разгелждат като интерфейси сами по себе си, а не като такива, които е необходимо да се влагат в изрична конструкция. освен т'ва проверката за такива според мен няма как да е красива, даже да не кажа, че задължително трябва да е доста грозничка.Публикувано предиИзненадахте ме с
__add__
.Имплементирайте го както искате. Няма да правим проверки за това.
В интерфейса може да има
foo
, но не може да има_foo
или__foo
. За__foo__
-- вие си изберете.Аз лично бих разрешил оператори да могат да се дефинират в интерфейс.
Публикувано предиИ още: форумите се форматират с Markdown. Натиснете "Редактирай" на мненията си, ако нещо ви е чудно.
Публикувано предиДа мислим ли за наследственост?
Публикувано предиЕдин глупав въпрос - docstring може да е само
""" text """
или
'''text'''
нали? Не може да се смесват кавичките или да са само едини кавички, или?
Питам по повод теста на Станко (test_doc_string_is_overriden).
И още нещо:
Ако intf.method има keyword-only аргументи, то klass.method трябва да има същите. Не е задължително да са дефинирани в същия ред.
klass.method(self, *, a, b)
е валидна имплементация наintf.method(self, *, b, a)
.^^ - ОК, но как трябва да реагираме при другата ситуация:
intf.method( self, a, b, *args ) klass.method( self, a, b, *aaargs )
Аналогично и за
**kwargs
и**kwargs123123
, например?Публикувано преди@Кирил
Може да е още
"text", 'text', r'text'
и всякакъв друг начин който се сетиш за изписване на низов литерал.method(self, *blargs)
имплементираmethod(self, *args)
.Публикувано предиАко искаме да ползваме методите на модула inspect, може да имаме проблеми - някои от тях работят само ако кода се намира във файл. Въпросът ми е как се изпълнява кода от домашните които предаваме - записан ли е във файл, който се стартира или не ? Хубаво е да го имаме предвид, защото това може да доведе до обърквания на много хора(и 0 точки на уж работещо домашно).
Публикувано преди@Стефан - мерси.
Иначе и аз подкрепям въпроса на Ангел, макар че предполагам няма да имаме проблеми.
Публикувано преди
Трябва да сте влезли в системата, за да може да отговаряте на теми.