Домашни > Подаръци ще има за всички от сърце > Решения > Решението на Елена Гинкова

Резултати
8 точки от тестове
0 точки от учител

8 точки общо

16 успешни теста
4 неуспешни теста
Код
Скрий всички коментари

 1import re
 2MAX_AGE = 5
 3
 4class Santa(object):
 5    """"Singleton class. Contains all kids and their wishes"""
 6    _instance = None
 7
 8    #kid => present
 9    _kids_presents = {}
10
11    def __find_signiture(self, letter):
12        return re.search(r'^\s*(\d+)\s*$', letter, flags=re.MULTILINE).group(1)
13
14    def __find_present(self, letter):
15        return re.search(r'(["\'])([A-Za-z0-9\s]*)\1', letter).group(2)
16
17    def __new__(cls):
18        if not cls._instance:
19            cls._instance = object.__new__(cls)
20        return cls._instance
21
22    def new_kid(self, kid):
23        self._kids_presents[kid] = None
24
25    def __matmul__(self, letter):
26        """Letter to Santa"""
27        signature = self.__find_signiture(letter)
28        present = self.__find_present(letter)
29        for kid in self._kids_presents.keys():
30            if str(id(kid)) == signature:
31                self._kids_presents[kid] = present
32                break
33    
34    def __call__(self, kid, wish):
35        """Phone Santa"""
36        present = self.__find_present(wish)
37        self._kids_presents[kid] = present
38
39    def __iter__(self):
40        return self._generator()
41
42    def _generator(self):
43        for kid, present in self._kids_presents.items():
44            if present is not None:
45                yield present
46
47    def __most_wanted(self):
48        presents_counter = {}
49        curr_present = None
50        curr_max_count = 0
51        for kid, present in self._kids_presents.items():
52            if present:
53                presents_counter[present] = presents_counter.get(present, 0) + 1
54                if presents_counter[present] > curr_max_count:
55                    curr_present = present
56                    curr_max_count = presents_counter[present]
57        return curr_present
58
59    def xmas(self):
60        def_present = self.__most_wanted()
61
62        for kid, present in self._kids_presents.items():
63            if kid.age <= MAX_AGE and def_present:
64                if kid.naughty:
65                    present = 'coal'
66                if not present:
67                    present = def_present
68                kid(present)
69                self._kids_presents[kid] = None
70            kid.age += 1
71            kid.naughty = False
72
73
74class Kid(type):
75    """"Meta class. Ensures there is a call method in the class that will inherit the metacls. Has logic if a kid has thrown an exception to mark him as naughty"""
76    def __call__(cls, *args, **kwargs):
77            instance = super().__call__(*args, **kwargs)
78            Santa().new_kid(instance)
79            instance.age = 0
80            instance.naughty = False
81            return instance
82
83    def __new__(cls, name, bases, attr_dict):
84        if '__call__' not in attr_dict:
85            raise NotImplementedError('Оправи си детето?! Не чува, като го викаш!')
86        for key, value in attr_dict.items():
87            #                           because otherwise it wrappes all my dunders :((
88            if callable(value) and not str(key).startswith('_'):
89                func = value
90                def wrapped(self, *args, **kwargs):
91                    try:
92                        func(self, *args, **kwargs)
93                        self.naughty = False
94                    except Exception as e:
95                        self.naughty = True
96                        raise e
97                attr_dict[key] = wrapped
98        return super().__new__(cls, name, bases, attr_dict)

.......F.....F...FF.
======================================================================
FAIL: test_santa_gift_order (test.TestSanta.test_santa_gift_order)
Test ordering of the Santa iterator.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 260, in test_santa_gift_order
self.assertEqual(list(self.santa), ["toy2v2", "toy3", "toy1"])
AssertionError: Lists differ: ['toy1', 'toy2v2', 'toy3'] != ['toy2v2', 'toy3', 'toy1']

First differing element 0:
'toy1'
'toy2v2'

- ['toy1', 'toy2v2', 'toy3']
+ ['toy2v2', 'toy3', 'toy1']

======================================================================
FAIL: test_xmass_naughty (test.TestSanta.test_xmass_naughty)
Test a Christmas with naughty kids.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 222, in test_xmass_naughty
with self.assertRaises(ZeroDivisionError):
AssertionError: ZeroDivisionError not raised

======================================================================
FAIL: test_xmass_public_with_no_error (test.TestSanta.test_xmass_public_with_no_error)
Test a Christmas with not-so-naughty kids.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 246, in test_xmass_public_with_no_error
self.assertEqual(kid1.public_without_error(), 42)
AssertionError: None != 42

======================================================================
FAIL: test_xmass_years_5_and_over (test.TestSanta.test_xmass_years_5_and_over)
Test with passing years with kid aged 5 and over.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 213, in test_xmass_years_5_and_over
self.assertEqual(kid1.SECRET_PRESENT, None)
AssertionError: 'toy' != None

----------------------------------------------------------------------
Ran 20 tests in 0.024s

FAILED (failures=4)

Дискусия
История

t1from unittest.mock import Mockt1import re
2mock = Mock()2MAX_AGE = 5
3mock.assertt()3 
4class Santa(object):
5    """"Singleton class. Contains all kids and their wishes"""
6    _instance = None
7 
8    #kid => present
9    _kids_presents = {}
10 
11    def __find_signiture(self, letter):
12        return re.search(r'^\s*(\d+)\s*$', letter, flags=re.MULTILINE).group(1)
13 
14    def __find_present(self, letter):
15        return re.search(r'(["\'])([A-Za-z0-9\s]*)\1', letter).group(2)
16 
17    def __new__(cls):
18        if not cls._instance:
19            cls._instance = object.__new__(cls)
20        return cls._instance
21 
22    def new_kid(self, kid):
23        self._kids_presents[kid] = None
24 
25    def __matmul__(self, letter):
26        """Letter to Santa"""
27        signature = self.__find_signiture(letter)
28        present = self.__find_present(letter)
29        for kid in self._kids_presents.keys():
30            if str(id(kid)) == signature:
31                self._kids_presents[kid] = present
32                break
33    
34    def __call__(self, kid, wish):
35        """Phone Santa"""
36        present = self.__find_present(wish)
37        self._kids_presents[kid] = present
38 
39    def __iter__(self):
40        return self._generator()
41 
42    def _generator(self):
43        for kid, present in self._kids_presents.items():
44            if present is not None:
45                yield present
46 
47    def __most_wanted(self):
48        presents_counter = {}
49        curr_present = None
50        curr_max_count = 0
51        for kid, present in self._kids_presents.items():
52            if present:
53                presents_counter[present] = presents_counter.get(present, 0) + 1
54                if presents_counter[present] > curr_max_count:
55                    curr_present = present
56                    curr_max_count = presents_counter[present]
57        return curr_present
58 
59    def xmas(self):
60        def_present = self.__most_wanted()
61 
62        for kid, present in self._kids_presents.items():
63            if kid.age <= MAX_AGE and def_present:
64                if kid.naughty:
65                    present = 'coal'
66                if not present:
67                    present = def_present
68                kid(present)
69                self._kids_presents[kid] = None
70            kid.age += 1
71            kid.naughty = False
72 
73 
74class Kid(type):
75    """"Meta class. Ensures there is a call method in the class that will inherit the metacls. Has logic if a kid has thrown an exception to mark him as naughty"""
76    def __call__(cls, *args, **kwargs):
77            instance = super().__call__(*args, **kwargs)
78            Santa().new_kid(instance)
79            instance.age = 0
80            instance.naughty = False
81            return instance
82 
83    def __new__(cls, name, bases, attr_dict):
84        if '__call__' not in attr_dict:
85            raise NotImplementedError('Оправи си детето?! Не чува, като го викаш!')
86        for key, value in attr_dict.items():
87            #                           because otherwise it wrappes all my dunders :((
88            if callable(value) and not str(key).startswith('_'):
89                func = value
90                def wrapped(self, *args, **kwargs):
91                    try:
92                        func(self, *args, **kwargs)
93                        self.naughty = False
94                    except Exception as e:
95                        self.naughty = True
96                        raise e
97                attr_dict[key] = wrapped
98        return super().__new__(cls, name, bases, attr_dict)
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op