--- a/buses.py Sat Jun 10 20:56:48 2017 +0300 +++ b/buses.py Sat Jun 10 21:03:26 2017 +0300 @@ -66,7 +66,7 @@ self.pairs = set() # samannimiset lähellä olevat pysäkit def __repr__(self): return 'pysäkit[%r]' % self.tunniste - def aikataulu(self, määrä = 50): + def schedule(self, max_amount = 50): ''' Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, pysähdys), @@ -77,45 +77,45 @@ Mikäli pysäkille ei ole määrätty riittävästi pysähdyksiä kalenterissa, tuloslista jää alimittaiseksi, mahdollisesti jopa tyhjäksi. ''' - class PäivätLoppuError(Exception): - pass - # Hakee pysäkin aikataulut tiettynä päivänä. - def aikataulu_päivänä(päivä): - # Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain - # palautettaisiin tyhjä tulos, niin algoritmi jatkaisi etsintää loputtomiin. - if päivä > viimeinen_käyttöpäivä: - raise PäivätLoppuError() - taulu = [] - # Jokaiselle ajovuorolle, - for ajo in ajot.values(): - # jos tämä ajovuoro ajetaan tänä päivänä - if ajo.ajetaan_päivänä(päivä): - # ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen - # päätepysäkille, - pysähdys = ajo.pysäkkiReitillä(self) - if pysähdys and pysähdys is not ajo.reitti[-1]: - # ja jos tämä pysähdys on tulevaisuudessa, - aika = datetime.combine(päivä, time()) + pysähdys.saapumisaika - if aika >= nyt(): - # lisää pysähdys listaan. - taulu.append((aika, pysähdys)) - # Lajittele lopputulos saapumisajan mukaan. - taulu.sort(key = lambda tietue: tietue[0]) - return taulu - taulu = [] - päivä = tänään() + result = [] + date = tänään() # Niin kauan kuin aikatauluja ei ole vielä tarpeeksi, - while len(taulu) < määrä: + while len(result) < max_amount: try: # hae nykyisen päivän aikataulut ja lisää ne, - taulu += aikataulu_päivänä(päivä) - except PäivätLoppuError: + result += self.schedule_for_day(date) + except ValueError: # paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan, break # ja siirry seuraavaan päivään. - päivä += timedelta(1) + date += timedelta(1) # Typistä lopputulos haluttuun tulosmäärään. - return taulu[:määrä] + return result[:max_amount] + def schedule_for_day(self, date): + ''' + Hakee pysäkin aikataulut tiettynä päivänä. + ''' + # Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain + # palautettaisiin tyhjä tulos, niin algoritmi jatkaisi etsintää loputtomiin. + if date > viimeinen_käyttöpäivä: + raise ValueError('tried to retrieve schedule for date %s which is outside schedule data' % date) + result = [] + # Jokaiselle ajovuorolle, + for trip in ajot.values(): + # jos tämä ajovuoro ajetaan tänä päivänä + if trip.ajetaan_päivänä(date): + # ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen + # päätepysäkille, + stop = trip.pysäkkiReitillä(self) + if stop and stop is not trip.reitti[-1]: + # ja jos tämä pysähdys on tulevaisuudessa, + aika = datetime.combine(date, time()) + stop.saapumisaika + if aika >= nyt(): + # lisää pysähdys listaan. + result.append((aika, stop)) + # Lajittele lopputulos saapumisajan mukaan. + result.sort(key = lambda entry: entry[0]) + return result @property def linkki_karttaan(self): return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus)