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


Сляпа баба
Краен срок: 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()
Дискусия
Даниел Йорданов
18.11.2023 20:16

В случай, че не съществува такъв tuple, какво връща функцията - празен такъв, такъв, съдържащ само съществуващите или NONE?
Георги Кунчев
18.11.2023 15:27

Не е нужно да намериш всички, а само тези, които са нужни за твоя ФН.
Нелина Тотева
18.11.2023 14:34

Необходимо ли е да намерим всички интереснии методи или може само да проверим, че методите с имена буквите и цифрите от фн ни съществуват и са интересни?
Георги Кунчев
18.11.2023 13:09

Не, толкова скришни места няма да има.
Цветомир Гълъбов
18.11.2023 12:42

def path_to_Clue(): def path_to_Clue_2(): def Q(): raise BaseException("axa found me") ако имаме нещо такова очаква ли да можем да намерим Q() тъй като тя може да стане видима само ако извикаме горните функции иначе е видима само първата ?
Георги Кунчев
18.11.2023 12:32

За конкретния случай - без аргументи. Ако не е написано изрично в условието, нито една от функциите не очаква аргументи.
Рая Григорова
18.11.2023 12:15

Под "Извикване на метода възбужда TypeError..." се има предвид извикване на функцията с каквито и да е аргументи, или извикване без аргументи?
Георги Кунчев
18.11.2023 11:14

Да, възможно е.
Михаил Цанков
18.11.2023 10:24

Възможно ли е пътят към "интересен" метод да е ```clue_mothod_1.clue_mothod_2.clue_class.A```?
Георги Кунчев
17.11.2023 22:50

@Добромир, можеш да импортираш модула.