#Datove struktury #Poziadavky su iba ciastkove, takze som povedal ze je cca jedno co pouzijete #Nezhmotnovanie iteratora utriedenych rezervacii vsak implikuje, ze rezervacie #musia byt aspon trochu usporiadane #moje riesenie, asi dost zle ("asi", lebo mame iba ciastkove poziadavky) self._users = set() #set stringov self._bookrecords = [] #list BookRecordov BookRecord = namedtuple("BookRecord", "name reservations") #name string, #reservations usporiadany list Reservation Reservation = namedtuple("Reservation", "from_ to") #datetime #nevyhoda - zhmotnuje sa pre kazdu kninu jedna rezervacia #zakerna (ale mozno znesitelna) moznost fragmentacie rezervacii - moze byt ocakavatelna #ine moznosti self._users = set() #nie je ziaden dovod pouzit nieco ine, ale ak ste pouzili list, whatever self._bookrecords = [] #list mien knih, knihy sa mozu opakovat self._bookrecords = {} #mapa, ktora priradi knihe jej pocet self._bookrecords = {} #mapa, ktora priradi knihe jej pocet a rezervacie self._reservations = [] #zoradeny list trojic (od, do, rezervacia) #Zdvojene data nechceme (napr meno ako kluc aj value mapy) #list comprehensions vs generator expressions [i for i in range(10)] #list, zmotni sa (i for i in range(10)) #generator, nezhmotni sa #Dictionary if key in my_dict: my_dict[key] += 1 else my_dict[key] = 1 #Dictionary - lepsie my_dict[key] = my_dict.get(key, 0) + 1 #addbook vracia true a tato skutocnost je vyuzita dekoratorom #dekorator je porom mozne velmi lahko rozbit #Dedenie konstruktora #nemusite prepisovat kontruktor ked vola len konstruktor rodica #sum funguje zmysluplne aj pre booly sum([a == 1 for a in pole]) #naozaj nemusite 5-riadkove metody rozdelovat prazdnymi riadkami #criptic [0] [1] -> namedtuple alebo class #toto mate skade? def at_most_books(p): def more_parameters(*args, **kwargs): class TwoBookLibrary(*args): #mozete sa naozaj spolahnut na to _registred_books sa bude volat takto? def one_book(lib): class DecoratedLibrary(lib): def add_book(self, book_name): if(book_name not in self._registered_books): #co ak niekto zmeni identifikator _registred_books self._registered_books[book_name] = 1 return True return False return DecoratedLibrary #nesuroda uroven kodu def reserve_book(self, user_name, book_title, date_from, date_to): if book_title not in self.lib_books.keys() or user_name not in self.users or date_from > date_to: return False if is_valid_reservation(self.lib_books[book_title], [res for res in self.lib_reservations if res[2] is book_title], date_from, date_to): self.lib_reservations.append((date_from, date_to, book_title)) #ak toto naozaj potrebuje byt takto dajte to niekde separatne for i in reversed(range(1, len(self.lib_reservations))): if self.lib_reservations[i][0] < self.lib_reservations[i - 1][0]: self.lib_reservations[i], self.lib_reservations[i - 1] \ = self.lib_reservations[i - 1], self.lib_reservations[i] return True return False #u mna je to takto mierne funkcionalne smrncnute def reserve_book(self, user, book, date_from, date_to): if user not in self._users or date_from > date_to: return False disjoint_range = lambda rng: rng.to < date_from or date_to < rng.from_ is_free = lambda record: all((disjoint_range(range_) for range_ in record.reservations)) same_name = lambda record: record.name == book for record in filter(is_free, filter(same_name, self._bookrecords)): insort(record.reservations, Library.Reservation(date_from, date_to)) return True return False