Предизвикателства > Сляпа баба


Сляпа баба
Краен срок: 19.11.2023 18:00
Точки: 3

#### Защо Понеже знаем, че нямате търпение да разберете резултатите си от контролното, сме подготвили предизвикателство, с което можете да ги научите малко по-рано от останалите - в неделя, когато срокът за предаване на решения приключи. Пък и ако го решите, ще получите бонус точки за това. #### Какво Във файл "secret.py", който ще се намира в съседство на файла с вашето решение (в същата директория), сме поставили тайно съдържание. Съдържанието може да съдържа произволни обекти с произволни методи и атрибути, които имат произволна дълбочина. Например, може да има метод, който е на следния адрес `secret.path_clue.to_clue.a_clue.method_clue`, където: - `secret` е самият модул; - `path_clue` е обект в глобалния скоуп на модула `secret`; - `to_clue` е атрибут на обекта `path_clue`; - `a_clue` е атрибут на обекта `to_clue`; - `method_clue` е метод на обекта `a_clue`; Някои от методите, които можете да "изровите" от модула са важни и за целта на предизвикателството ще ги наричаме "интересни". Всеки "интересен" метод има име точно един символ (главна ASCII буква или цифра). Освен това всеки "интересен" модул изпълнява едно от следните условия: - Извикване на метода възбужда `TypeError` с текст "Опаааааа, тука има нещо нередно."; - Извикване на метода възбужда `BaseException` с произволен текст; - Извикване на метода с един позиционен аргумент от тип `int` връща подадения аргумент на квадрат, ако той е четно число, но нула, ако той е нечетно число; - Извикване на метода с два именувани аргумента от тип `str` с имена `left` и `right` връща конкатенация от двата аргумента като `left` стои отляво, а `right` отдясно; - Методът не е метод на самата инстанция, а статичен метод на класа ѝ. Може да има методи с име от точно един символ, но те да не изпълняват нито едно от условията по-горе. Това значи, че те не са "интересни". Може да има методи, които изпълняват някое от условията по-горе, но имената им да са с повече от един символ. Това значи, че те не са "интересни". - "Интересни" методи може да има само в обекти, които стоят зад имена, съдържащи "clue"! `secret.path.to.something` не е пътека, която може да ви доведе то "интересен" метод. #### Как Напишете функция `methodify`, която "разглежда" модула в дълбочина и връща `tuple` от "интересни" методи, дефинирани в него, с чиито имена можете да напишете "FN<вашият факултетен номер>". Например, ако аз имам факултетен номер "1MI23456", моята функция трябва да връща `tuple` от методи, чиито имена да изписват "FN1MI23456", което ще рече `tuple` от 10 метода, като: - първият метод от `tuple`-а е "интересен" метод с име "F"; - вторият метод от `tuple`-а е "интересен" метод с име "N"; - третият метод от `tuple`-а е "интересен" метод с име "1"; ...и така нататък. #### Къде Ако се справите успешно, можете да видите резултатите от контролното си в лога от тестовете под самото предизвикателство: ![Пример](/media/resources/challenge3.jpg)
 1import types
 2import unittest
 3
 4from solution import *
 5
 6
 7class TestMethodify(unittest.TestCase):
 8    """Test metodify function."""
 9
10    def test_metodify(self):
11        """Test metodify function."""
12        self.assertIsInstance(methodify, types.FunctionType)
13
14
15if __name__ == '__main__':
16    unittest.main()
 1import unittest
 2
 3from secret import _RESULTS
 4from solution import *
 5
 6
 7class TestMethodify(unittest.TestCase):
 8    """Test metodify function."""
 9
10    def test_metodify(self):
11        """Test metodify function."""
12        self.assertIn(methodify(), _RESULTS.keys())
13
14
15try:
16    result = _RESULTS[methodify()]
17    print("Резултат от контролното:\n"
18          f"    {result['correct']}/30 верни отговора.\n"
19          f"    {result['points']} точки.")
20except:
21    pass # No correct answer means no results
22
23if __name__ == '__main__':
24    unittest.main()
Дискусия
Георги Кунчев
19.11.2023 22:08

Ако си прав, плюс една точка.
Костадин Русалов
19.11.2023 21:36

Тестът не е напълно коректен (леко си противоречи с условието 😀), но ще ви покажа вторник на живо как да го оправите (защото сега имам да зуб…, така де, уча, за тест по КАРХ 😔)
Михаил Цанков
19.11.2023 20:41

😅
Георги Кунчев
19.11.2023 20:37

Еее, не ти стига, че само ти реши задачата, ама да ни нахраниш и тестовете... :smile: Може, да
Михаил Цанков
19.11.2023 20:21

Този ред от теста ```fun_key = tuple([globals()[f'method_{x}'] for x in 'FN' + key])``` не може ли да се напише без []? Не е ли просто итератор -> тъпъл, вместо итератор -> масив -> тъпъл?
Георги Кунчев
19.11.2023 15:06

Така е, не те интересува дали хвърля изключение. Ако е статичен метод на класа и има един символ за име, това е достатъчно. Просто дадох пример на колегата, че не всяко нещо, което хвърля недефинирано по-горе изключение, е автоматично не "интересно".
Цветомир Гълъбов
19.11.2023 14:57

Методът от последната точка, който е статичен метод на класа, също може да хвърли друг вид Exception или TypeError но с различен текст. Това защо би ни интересувало щом след като е статичен метод и е със един символ то той според условието е интересен .
Георги Кунчев
19.11.2023 13:55

Не съвсем. Метод, който очаква един `int`, за да го повдигне на квадрат, например, може да възбуди `TypeError` с различен текст, ако е извикан без този `int` параметър. Методът от последната точка, който е статичен метод на класа, също може да хвърли друг вид `Exception` или `TypeError` но с различен текст.
Мирослав Стояновски
19.11.2023 13:49

Това значи ли, че ако се хвърли нещо различно от TypeError или BaseException при извикване, метода не е интересен ? Също така, не е интересен и при хвърляне на TypeError с текст, различен от "Опааааа, тук има нещо нередно.", нали ?
Георги Кунчев
19.11.2023 13:42

Не, интересните са с точно един символ. Долни черти не се броят.