Седма задача

  1. Понякога се чудя дали съм невнимателен или просто неграмотен.

    Публикувано преди
  2. Ред 21 от примерния тест идва ли да рече, че трябва да се поражда задължително AssertionError или производни нему при проблемни ситуации? Не е ли по-добре предвид целта да си направим разни наши interface-related изключения?

    Публикувано преди
  3. Всъщност, да. Не знам защо избрах точно AssertionError, но това искаме.

    Публикувано преди
  4. Сега май ще сцепя мрака с доста тъп въпрос, но все пак да питам - значи в __new__ на метакласа си сменям __init__ на декориращия клас. В променения __init__ си получавам като параметър името на декорирания клас и си имам и методите на класът, които ще ни е interface. Обаче като тръгна да си взимам <декориран клас>.__dict__ и ми гърми с NameError, че няма такъв клас?!? Нещо тотално съм засрал начина или?

    P.S името на класа е коректно. Примерно ако имам

    @stack
    class MyStack: pass
    

    достъпвам с MyStack.__dict__, но ми казва че MyStack isn't defined

    Публикувано преди
  5. речника на класа се намира в __dict__ ( има долни черти ама като гледам сигурно и ти така си го написал)

    "значи в new на метакласа си сменям init на декорирания клас" - по скоро на декориращия клас

    П.С. Някой ще напише ли 1 наръчник как се форматират мнения в този форум?

    Публикувано преди
  6. @Илиян Да де, същото съм написал, объркал съм се малко. Проблемът с NameError-a си стои обаче.

    Публикувано преди
  7. Имах доброто желание да кажа нещо умно по въпросът на Мартин... ама не ми се получи... Интересно какво може да се окаже...

    иначе минавам по тия грозни часове само за да дам: https://github.com/kunev/Python-FMI/blob/master/07/my_test.py

    Публикувано преди
  8. @Мартин Асенов а защо достъпваш направо по името на класа? нали чрез __init__ си получаваш като параметър, класа който ще имплементира интерфейса.

    Публикувано преди
  9. "В интерфейса може да има само публични (незапочващи с _). Ако са дефинирани други атрибути (методи, започващи с _ или не-методи), трябва да се поражда грешка."

    А как процедираме с __call__ и други подобни. Логично е за __call__ да не хвърляме изключение. По-принцип в метакласа като атрибути отиват и __module__, а в дебъг режим се появява и __locals__. Тях да ги игнорираме?

    Публикувано преди
  10. @Калоян Йовчев:

    На 38 ред в test_complains_for_defined_methods_diff_than_docstring_or_pass_in_interface

    class intf3(metaclass=interface):
        def method1(self):
        return
    

    според мен трябва да минава. Дали ще е pass или return е все едно в тоя случай, не виждам причина да се третират различно.

    Публикувано преди
  11. @Станко:

    По условие пише само за pass или docstring, не пише нищо за return. Така че не знам. Също така не е ясно дали ако има дефиниран __call__ дали трябва да се игнорира или да се извежда грешка. :)

    Публикувано преди
  12. @Илиян:

    Аз ги игнорирам. Ето и хинт (може да има и други начини):

    if key[0] == '_' and key[1] != '_': return AssertionError
    

    Предполагам, че вече ти е станало ясно. Но не знам дали има по-добър/правилен начин. Все още съм в началото на писането на задачата.

    P.S. Под "не-методи" какво точно се разбира?

    Публикувано преди
  13. то и аз го игнорирам, само че в други езици си има интерфейс Callable, и тука този интерфейс се реализира, чрез __call__ метода. Логично би било, поне според мене да може да се слага в интерфейс.

    Под не-методи се има в предвид атрибути. Примерно

    class foo(metaclass=interface):
        a = 0
    
    Публикувано преди
  14. @Илиян:

    Мерси!

    Интересно, а __add__ и другите подобни - дали и тях трябва да броим за методи или да пускаме грешка?

    Публикувано преди
  15. Метод е всеки атрибут на класа, който може да бъде извикан. Не мисля, че това дава избор да решаваме какво да броим за метод и какво не. Въпросът тук по-скоро е дали да се разглеждата тези методи, тъй като започват с – и не са публични.

    Публикувано преди
  16. Напротив, публични са. Подчертавките са просто naming convetion за системни атрибути и според мен трябва да може да се ползват в interface.

    Публикувано преди
  17. А не е ли редно за това какво е функция(която в тялото на клас е съответно метод) да се осланяме на това, което писалите python са решили, че е функция, за което си има проверка? Така ми се вижда най-чисто, като че ли. А __call__(явно става с '\_') и подобните 'системни' методи по-скоро могат да се разгелждат като интерфейси сами по себе си, а не като такива, които е необходимо да се влагат в изрична конструкция. освен т'ва проверката за такива според мен няма как да е красива, даже да не кажа, че задължително трябва да е доста грозничка.

    Публикувано преди
  18. Изненадахте ме с __add__.

    Имплементирайте го както искате. Няма да правим проверки за това.

    В интерфейса може да има foo, но не може да има _foo или __foo. За __foo__ -- вие си изберете.

    Аз лично бих разрешил оператори да могат да се дефинират в интерфейс.

    Публикувано преди
  19. И още: форумите се форматират с Markdown. Натиснете "Редактирай" на мненията си, ако нещо ви е чудно.

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

    Публикувано преди
  21. Един глупав въпрос - 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, например?

    Публикувано преди
  22. @Кирил

    Може да е още "text", 'text', r'text' и всякакъв друг начин който се сетиш за изписване на низов литерал.

    method(self, *blargs) имплементира method(self, *args).

    Публикувано преди
  23. Ако искаме да ползваме методите на модула inspect, може да имаме проблеми - някои от тях работят само ако кода се намира във файл. Въпросът ми е как се изпълнява кода от домашните които предаваме - записан ли е във файл, който се стартира или не ? Хубаво е да го имаме предвид, защото това може да доведе до обърквания на много хора(и 0 точки на уж работещо домашно).

    Публикувано преди
  24. @Стефан - мерси.

    Иначе и аз подкрепям въпроса на Ангел, макар че предполагам няма да имаме проблеми.

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

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