'Convert naive time to local time.
This method should be used to construct localtimes, rather
than passing a tzinfo argument to a datetime constructor.
is_dst is used to determine the correct timezone in the ambigous
period at the end of daylight saving time.
>>> from pytz import timezone
>>> fmt = \'%Y-%m-%d %H:%M:%S %Z (%z)\'
>>> amdam = timezone(\'Europe/Amsterdam\')
>>> dt  = datetime(2004, 10, 31, 2, 0, 0)
>>> loc_dt1 = amdam.localize(dt, is_dst=True)
>>> loc_dt2 = amdam.localize(dt, is_dst=False)
>>> loc_dt1.strftime(fmt)
\'2004-10-31 02:00:00 CEST (+0200)\'
>>> loc_dt2.strftime(fmt)
\'2004-10-31 02:00:00 CET (+0100)\'
>>> str(loc_dt2 - loc_dt1)
\'1:00:00\'
Use is_dst=None to raise an AmbiguousTimeError for ambiguous
times at the end of daylight saving time
>>> try:
...     loc_dt1 = amdam.localize(dt, is_dst=None)
... except AmbiguousTimeError:
...     print(\'Ambiguous\')
Ambiguous
is_dst defaults to False
>>> amdam.localize(dt) == amdam.localize(dt, False)
True
is_dst is also used to determine the correct timezone in the
wallclock times jumped over at the start of daylight saving time.
>>> pacific = timezone(\'US/Pacific\')
>>> dt = datetime(2008, 3, 9, 2, 0, 0)
>>> ploc_dt1 = pacific.localize(dt, is_dst=True)
>>> ploc_dt2 = pacific.localize(dt, is_dst=False)
>>> ploc_dt1.strftime(fmt)
\'2008-03-09 02:00:00 PDT (-0700)\'
>>> ploc_dt2.strftime(fmt)
\'2008-03-09 02:00:00 PST (-0800)\'
>>> str(ploc_dt2 - ploc_dt1)
\'1:00:00\'
Use is_dst=None to raise a NonExistentTimeError for these skipped
times.
>>> try:
...     loc_dt1 = pacific.localize(dt, is_dst=None)
... except NonExistentTimeError:
...     print(\'Non-existent\')
Non-existent'

def localize(self, dt, is_dst=False):

    if (dt.tzinfo is not None):
        raise ValueError('Not    naive    datetime    (tzinfo    is    already    set)')
    possible_loc_dt = set()
    for delta in [timedelta(days=(-1)), timedelta(days=1)]:
        loc_dt = (dt + delta)
        idx = max(0, (bisect_right(self._utc_transition_times, loc_dt) - 1))
        inf = self._transition_info[idx]
        tzinfo = self._tzinfos[inf]
        loc_dt = tzinfo.normalize(dt.replace(tzinfo=tzinfo))
        if (loc_dt.replace(tzinfo=None) == dt):
            possible_loc_dt.add(loc_dt)
    if (len(possible_loc_dt) == 1):
        return possible_loc_dt.pop()
    if (len(possible_loc_dt) == 0):
        if (is_dst is None):
            raise NonExistentTimeError(dt)
        elif is_dst:
            return (self.localize((dt + timedelta(hours=6)), is_dst=True) - timedelta(hours=6))
        else:
            return (self.localize((dt - timedelta(hours=6)), is_dst=False) + timedelta(hours=6))
    if (is_dst is None):
        raise AmbiguousTimeError(dt)
    filtered_possible_loc_dt = [p for p in possible_loc_dt if (bool(p.tzinfo._dst) == is_dst)]
    if (len(filtered_possible_loc_dt) == 1):
        return filtered_possible_loc_dt[0]
    if (len(filtered_possible_loc_dt) == 0):
        filtered_possible_loc_dt = list(possible_loc_dt)
    dates = {}
    for local_dt in filtered_possible_loc_dt:
        utc_time = (local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset)
        assert (utc_time not in dates)
        dates[utc_time] = local_dt
    return dates[[min, max][(not is_dst)](dates)]
