1def memnick(*funcs, memory={}):
2 def format_func_name(name):
3 names = name.split("_")
4 return " ".join(name.capitalize() for name in names)
5
6 if len(funcs) > 0:
7 result = []
8 for func in funcs:
9 formated_name = format_func_name(func.__name__)
10 if formated_name in memory:
11 for caller, phrase in memory[formated_name]:
12 result.append(f"С гласа на {caller}: {phrase}")
13 return result
14
15 def decorator(func):
16 def wrapper():
17 result = func()
18 called = result.split(",")[0]
19 if called not in memory:
20 memory[called] = set()
21 formated_name = format_func_name(func.__name__)
22 memory[called].add((formated_name, result))
23 return result
24 wrapper.__name__ = func.__name__
25 return wrapper
26 return decorator
27
28@memnick()
29def божана():
30 return "Почекаин, ти си луд!"
31
32божана()
33
34@memnick()
35def бай_венци():
36 return "Емил, айде да играем шах!"
37
38бай_венци()
39
40@memnick()
41def бай_венци():
42 return "Емил, гладен съм!"
43
44бай_венци()
45
46@memnick()
47def емил():
48 return "Божана, намери сина ми."
49
50емил()
51
52@memnick()
53def емил():
54 return "Почекаин, нищо не става от тебе."
55
56емил()
57
58@memnick()
59def почекаин():
60 return "Божана, ще те любя."
61
62почекаин()
63
64
65print(memnick(емил, божана))
66
67# ["С гласа на Бай Венци: Емил, айде да играем шах!",
68# "С гласа на Бай Венци: Емил, гладен съм!",
69# "С гласа на Емил: Божана, намери сина ми.",
70# "С гласа на Почекаин: Божана, ще те любя."]
71
72print(memnick(бай_венци))
73# [] - никой не се е обръщал към Бай Венци в никоя от горните фрази
74
75print(memnick(почекаин))
76# ["С гласа на Божана: Почекаин, ти си луд!",
77# "С гласа на Емил: Почекаин, нищо не става от тебе."]
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
E
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
F
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
F
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
.F
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
======================================================================
ERROR: test_memnick_decorates_variable_functions (test.TestMemnick.test_memnick_decorates_variable_functions)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 108, in test_memnick_decorates_variable_functions
solution.memnick()(граматиков)("Капан 1", "Капан 2", "кос", "друг кос", утрепан_от_мамника=True)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: memnick.<locals>.decorator.<locals>.wrapper() got an unexpected keyword argument 'утрепан_от_мамника'
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
======================================================================
FAIL: test_memnick_does_not_memorize_repetitions (test.TestMemnick.test_memnick_does_not_memorize_repetitions)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 76, in test_memnick_does_not_memorize_repetitions
self.assertEqual(
~~~~~~~~~~~~~~~~^
["С гласа на Бай Венци: Емил, айде да играем шах!"],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
solution.memnick(емил),
^^^^^^^^^^^^^^^^^^^^^^^
)
^
AssertionError: Lists differ: ['С г[20 chars]мил, айде да играем шах!'] != ['С г[20 chars]мил, гладен съм!', 'С гласа на Бай Венци: Емил[18 chars]ах!']
First differing element 0:
'С гласа на Бай Венци: Емил, айде да играем шах!'
'С гласа на Бай Венци: Емил, гладен съм!'
Second list contains 1 additional elements.
First extra element 1:
'С гласа на Бай Венци: Емил, айде да играем шах!'
- ['С гласа на Бай Венци: Емил, айде да играем шах!']
? - ^^^^^^^^^ ---- ^
+ ['С гласа на Бай Венци: Емил, гладен съм!',
? ++ ^^^^ ^
+ 'С гласа на Бай Венци: Емил, айде да играем шах!']
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
======================================================================
FAIL: test_memnick_memorizes (test.TestMemnick.test_memnick_memorizes)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 51, in test_memnick_memorizes
self.assertEqual(
~~~~~~~~~~~~~~~~^
[
^
...<5 lines>...
solution.memnick(божана, емил),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
AssertionError: Lists differ: ['С г[133 chars]а на Почекаин: Божана, ще те любя.', 'С гласа [36 chars]ах!'] != ['С г[133 chars]а на Емил: Божана, намери сина ми.', 'С гласа [123 chars]ах!']
First differing element 2:
'С гласа на Почекаин: Божана, ще те любя.'
'С гласа на Емил: Божана, намери сина ми.'
Second list contains 2 additional elements.
First extra element 4:
'С гласа на Бай Венци: Емил, гладен съм!'
['С гласа на Лазар: Божана, може би ще те любя.',
'С гласа на Митака: Божана, на този етап не съм сигурен дали искам да те '
'любя.',
+ 'С гласа на Емил: Божана, намери сина ми.',
'С гласа на Почекаин: Божана, ще те любя.',
+ 'С гласа на Бай Венци: Емил, гладен съм!',
'С гласа на Бай Венци: Емил, айде да играем шах!']
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
======================================================================
FAIL: test_memnick_splits_properly (test.TestMemnick.test_memnick_splits_properly)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 93, in test_memnick_splits_properly
self.assertEqual(
~~~~~~~~~~~~~~~~^
["С гласа на Бай Венци: Емил, айде да играем шах!"],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
solution.memnick(емил),
^^^^^^^^^^^^^^^^^^^^^^^
)
^
AssertionError: Lists differ: ['С г[20 chars]мил, айде да играем шах!'] != ['С г[20 chars]мил, гладен съм!', 'С гласа на Бай Венци: Емил[18 chars]ах!']
First differing element 0:
'С гласа на Бай Венци: Емил, айде да играем шах!'
'С гласа на Бай Венци: Емил, гладен съм!'
Second list contains 1 additional elements.
First extra element 1:
'С гласа на Бай Венци: Емил, айде да играем шах!'
- ['С гласа на Бай Венци: Емил, айде да играем шах!']
? - ^^^^^^^^^ ---- ^
+ ['С гласа на Бай Венци: Емил, гладен съм!',
? ++ ^^^^ ^
+ 'С гласа на Бай Венци: Емил, айде да играем шах!']
Stdout:
['С гласа на Бай Венци: Емил, гладен съм!', 'С гласа на Бай Венци: Емил, айде да играем шах!', 'С гласа на Емил: Божана, намери сина ми.', 'С гласа на Почекаин: Божана, ще те любя.']
[]
['С гласа на Божана: Почекаин, ти си луд!', 'С гласа на Емил: Почекаин, нищо не става от тебе.']
----------------------------------------------------------------------
Ran 5 tests in 0.003s
FAILED (failures=3, errors=1)
Виктор Бечев
15.03.2026 14:41Получаваш точка, защото тестовете щяха да ти дадат една, ако нямаше всичките тези call-ове в кода. Ще споменем за това на лекцията.
|
15.03.2026 13:12
15.03.2026 14:02