Пето предизвикателство

  1. Здравейте,

    Имам следните въпроси по новото предизвикателство.

    1. Само с букви от латинската азбука ли ще се тества ?
    2. Функцията за избирателно прилагане на шифъра винаги на един аргумент показващ позицията на аргумента на декорираната функция в сигнатурата и ли е ?
    3. Как третираме не позиционните аргументи като цяло и конкретно от гледна точка на избирателната функция ?
    4. Трябва ли да може функцията да бъде пропусната ?
    5. Също така изглежда логично просто да игнорираме не низов вход/изход ?
  2. @ceaser_input(-13, lambda key: key > 0)
    def make_a_speech(name, *args):
        print('{} says:\n{}'.format(name, ' '.join(args)))
    
    
    >>> make_a_speech('Reg', 'JUNG', 'UNIR', 'GUR', 'EBZNAF',
                      'RIRE', 'QBAR', 'SBE', 'HF?', '...')
    Reg says:
    WHAT HAVE THE ROMANS EVER DONE FOR US? ...
    
    1. Тук не трябва ли и Reg says да се "дешифрира"?

    2. В декоратора ефекта от тази (точно тази) ламбда е почти никакъв?

    3. make_a_speech не трябва ли да връща стринга, а не да само да го принтира?

  3. @Владимир Начев, 3. make_a_speech не трябва ли да връща стринга, а не да само да го принтира?

    В декоратор можеш да промениш аргументите, с които е извикана функцията, и после да върнеш същата тази функция с новите аргументи.

  4. @Атанас, тук става въпрос за *args в декоратора. По принцип *args е неограничен брой аргументи, съответно в декоратора ще имаш *args, а не (name, *args) като аргументи. Съответно в декоратора, нека условно кажем, че имаме *args1, ще бъде *args1 = (name, *args). Тогава args1[0] = name.

    ПП: наясно съм, че го обясних доста зле, но се надявам да ме разбра какво имам предвид.

  5. Да считаме ли, че функцията, която подаваме като параметър на ceaser_input декоратора, ще е само с 1 аргумент и ще е върху аргументите на декорираната фунцкия? Извинявам се, че повтарям колегата по-горе :)

  6. @Георги, доколкото разбирам тази функция трябва да приема един аргумент, който да е индекс на кортежа с аргументи, които декорираната функция приема. Ако функцията върне истина този аргумент трябва да бъде дешифрован, в противен случай не го променя.

  7. @Драгомир, като гледам тестовете ти, ако функцията, която трябва да бъде декорирана приема думи с малки букви, то малките букви не трябва да бъдат дешифровани. Всичко това е логично, само че на някой места има разминаване (вероятно не съм разбрал нещо правилно. Например този тест:

     def test_ceaser_input2(self):
            Tests.odd_positions('a', 'b', 'cdefg', 'hi', 'JKL',
                                'm', 'n', 'OPQRSTU', 'V', 'WXYZ')
            self.assertEqual(
                sys.stdout.getvalue(),
                "D b FGHIJ hi MNO m Q OPQRSTU Y WXYZ\n")
    ако това, което предположих е вярно не трябва ли функцията да връща този стринг a b cdefg hi MNO m n OPQRSTU Y WXYZ\n. Защо 'a' е променено, а 'б'например не е?
  8. @Стоян, малко се пообърках, но като разгледах отново теста, мисля че няма грешка. 'a' е променено, а 'b' не е, защото ламбда функцията, която подавам на ceaser_input е lambda key: key % 2 == 0, т.е. дешифрира се всеки аргумент, на четна позиция ('a' е на позиция 0, 'b' е на позиция 1). А самите малки букви би трябвало да не са от значение, след дешифриране трябва да станат големи.

  9. @Драгомир Тунчев принципно в самия декоратор се подава функция, а в помощната функция в самия декоратор се подават аргументите. Поне аз така съм го реализирал и си работи. Надявам се сме на една страница и не съм се заблудил.

    Имам няколко въпроса за декоратори все пак - Каква е разликата между декоратор реализиран с from decorator import decorator и from functools import wraps. И също за декоратора @property - каква е разликата между това и другите начини на задаване на атрубут на класа (Например property(lambda self: self.field)). Доколкото разбирам декоратора @property прави полето read-only ? info

    П.П. За тези, които разчитат само на материалите от лекции, може ли да са малко по-добре написани ако може- поне насоки какво е важно, разлика между това онова. Наистина ми се ще да си чета от лекциите а не да google-вам, защото със сигурност може да изпусна нещо важно. След това един календар със събитията няма да е излишен, не че се оплаквам но едва днес разбрах за предизвикателството, а вчера посещавах сайта - в секцията за новини го няма. Стремя се коментара да ми е конструктивен, не хейтване все пак всички сме заети и съм наясно, че воденето на курса в голяма степен е на доброволни начала.

    • Само с букви от латинската азбука ли ще се тества ?: Само върху латинската азбука, да
    • Функцията за избирателно прилагане на шифъра винаги на един аргумент показващ позицията на аргумента на декорираната функция в сигнатурата и ли е ?: Да, функцията за избирателно "дешифриране" получава един аргумент отговарящ на позицията (започва от 0, 1, 2...) на аргумента. И връща True(се очаква прилагане на шифъра)/False(в противен случай)
      • Да считаме ли, че функцията, която подаваме като параметър на ceaser_input декоратора, ще е само с 1 аргумент и ще е върху аргументите на декорираната фунцкия? Извинявам се, че повтарям колегата по-горе :): Ще е върху индекса му, като започваме броенето от 0.
    • Как третираме не позиционните аргументи като цяло и конкретно от гледна точка на избирателната функция ? Попринцип, в такива ситуации гледаш функцията да си ги получи нормално, ако няма други условия. В този случай няма да тестваме за именовани аргументи
    • Трябва ли да може функцията да бъде пропусната ?: Няма такова условие. Функцията за избирателно прилагане е задължителен аргумент на ceaser_input
    • Също така изглежда логично просто да игнорираме не низов вход/изход ?: На съм съгласен. Ако съм си направил труда да кажа, че имам вход/изход, който искам да се шифрира очевидно не очаквам данни върху, които това да не може да се случи. Още по-малко очаквам такива данни тихо да бъдат "пропуснати" без обработка.. в случая за входа единствено подадената функция служи за идентификация кое да бъде обработено и кое не
    • make_a_speech не трябва ли да връща стринга, а не да само да го принтира?. Не, нарочно не връща, за да се подчертае разликата между ceaser_input и ceaser_output.
    • Може да се направи make_a_speech(name, *args) в декоратора и да се дешифрират само *args без name.. Не, декоратора не знае какви/колко аргументи очаква декорираната от него функция. В общия случай(освен, ако нямаш добра причина) това е най-доброто решение т.к. позволява да бъде преизползван в по-голяма общност от случаи.
      • @Драгомир, не съм съгласен, веднъж обявено отделно от args, в дефиницията на функцията make_a_speech, name няма как да е елемент на args.: В областта на функцията да, но там, където дефинираш декорираната, никой няма представа за това name. Tам получаваш един кортеж с подредени стойности освен, ако не дефинираш нещо друго... А непосредствено преди този отговор има и обяснение защо не искаме да го правим.
    • Между другото пише се caesar, а не ceaser. Ако го пиша вярно сигурно няма да ми минат тестовете !? :laughing:: Напълно си прав! Отбелязваме си, че за напред трябва да следваме собствените си съвети и да пишем код с отворен отстрани речник, но за тази задача остава сигнатурата с правописна грешка. Приема се да го напишете правилно и по-долу в решението си да добавите ново име по подобен начин: ceaser_input = caesar_input
    • А и двете функции ли кодират? Втората малко ми изглежда да е декодираща?: Единствената разлика м/у кодиране/декодуране в Цезаровия шифър е в посоката на отместване. Това в случая се определя от знака на отместването и реално не ни касае кое работи в права и кое в обратна посока.
  10. Също така изглежда логично просто да игнорираме не низов вход/изход ?

    На съм съгласен. Ако съм си направил труда да кажа, че имам вход/изход, който искам да се шифрира очевидно не очаквам данни върху, които това да не може да се случи. Още по-малко очаквам такива данни тихо да бъдат "пропуснати" без обработка.. в случая за входа единствено подадената функция служи за идентификация кое да бъде обработено и кое не.

    Може ли пример какво означава да се шифрира не низов вход изход по този начин. Списъци и енторки с низове ? До какво ниво на влагане и т.н. ? Може би също числа ?

  11. @Йончо Йончев

    • декоратора ceaser_input преима два аргумента число и функция(за референция ще я наречем should_shift) и връща декорирана функция.

      • should_shift е функция на един аргумент. Получава цяло число 0, 1, 2... отговарящо на позицията на получен от декорорината и връща True/False, отговарящо на "Дали да обработим съответния аргумент с желаното отместване?". Тя се подава от този, който ползва декроратора
      • декорираната функция преценява на кои аргументи трябва да се направи отместване на базата на should_shift и го прилага преди да изпълни рутината зададена от оригиналната функция.
    • модула decorator не е вграден в Python и не съм запознат с него, така че към момента не мога да го сравня с нищо.

    • От друга страна functools.wrap не прави декоратор. Единственото позволява, когато декорираш дадена функция новия обект(декорираната функция) да има същоите __name__ и __doc__ като оригиналната

    • декоратор е просто функция получаваща функция(original_func) и връщаща(decorated_func). т.е.:

      class A:
          @property
          def x(self):      # Това ти е все едно getter_func
          """
              docstring_conent_here
          """
              return ...
      
          @x.setter
          def x(self, value):  # Това ти е все едно setter_func
              ...
      
          @x.deleter
          def x(self, value):  # Това ти е все едно deleter_func
              ...             
      

      и

      class A:
          x = property(getter_func, setter_func, deleter_func, docstring...)
      

    са семантично еднакви. Разликата идва основно в начина на записване. За предпочитане е първия, т.к. използва стандартния начин за дефиниране на класове и методи...

    • Слайдовете са предимно референтни. Може би по-добрия вариант преди да опиташ google е дирекно в документацията на python и конзолата.

    @Иван Бобев

    В случая единствените данни, за които се очаква да работи шифъра са низове. Т.е. очакваш, че навскъде, където някой каже, че се налага Цезарово отместване ще има низ и всичко ще работи.

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