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


Сляпа баба
Краен срок: 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 13:37

Функцията _F води ли се интересна или не трябва да проверяваме за _ и __ пред методи и атрибути
Георги Кунчев
19.11.2023 13:36

@Мирослав, относно "Как да проверим дали "Извикване на метода с един позиционен аргумент от тип int връща подадения...". Няма да правим функция, която изглежда като интересна но за конкретна стойност не е. Ако подадеш някакво случайно число и се вдигне на квадрат, значи това е.
Георги Кунчев
19.11.2023 13:30

`TypeError` наследява `BaseException`, но не е чист `BaseException`. Тук говорим за възбуждане на конкретно изключение, а не изключение, което го наследява.
Мирослав Стояновски
19.11.2023 12:46

-Извикване на метода възбужда TypeError с текст "Опаааааа, тука има нещо нередно."; -Извикване на метода възбужда BaseException с произволен текст; Тук ако второто условие е достатъчно за да бъде една функция интересна, тогава първото условие не е ли излишно, тъй като TypeError e вид BaseException, и тъй като "Опаааааа, тука има нещо нередно." е произволен текст ?
Георги Кунчев
19.11.2023 12:00

Само един е за всеки символ. Подавате един и същ.
Михаил Цанков
19.11.2023 11:58

Понеже факултетните ни номера имат много еднакви цифри (нули) за всяка една от тях трябва да открием различен интересен метод или търсим само един и го слагаме навсякъде в tuple?
Мирослав Стояновски
19.11.2023 11:37

Как да проверим дали "Извикване на метода с един позиционен аргумент от тип int връща подадения аргумент на квадрат, ако той е четно число, но нула, ако той е нечетно число;" работи за всяко х? Възможно е функцията да работи коректно за всяко х освен 4838*10^63728, а пък за тази стойност да прави нещо напълно различно. Тогава по дефиниция функцията не би трябвало да бъде интересна. Как да се справим с този проблем без да вършим тежки изчисления за проверка стойността на функцията за много стойности на х?
Михаил Цанков
19.11.2023 11:08

'Извикване на метода с един позиционен аргумент от тип int' това значи ли, че презаписваме self (```fun(self)```) или сигнатурата на функцията е ```fun(self, num)```?
Георги Кунчев
18.11.2023 21:11

Уверявам, че ще съществува такъв `tuple`. Методи има за всички. А `secret.A` е интересен случай. За конкретната задача няма такъв, но по принцип не мисля, че е проблем, дори да има. Просто би било гадно от наша страна да закачим метод директно на модула, като обект, който сте импортирали. Приеми, че не е валиден случай и не се очаква.
Даниел Йорданов
18.11.2023 20:43

Път във формат secret.A, отговаря ли на изискванията или трябва да има поне едно clue?