code: def astimezone_and_leap_second(self, tz):
          
          dt, leap_second = self.utc_datetime_and_leap_second()
          normalize = getattr(tz, 'normalize', None)
          if self.shape and normalize is not None:
              dt = array([normalize(d.astimezone(tz)) for d in dt])
          elif self.shape:
              dt = array([d.astimezone(tz) for d in dt])
          elif normalize is not None:
              dt = normalize(dt.astimezone(tz))
          else:
              dt = dt.astimezone(tz)
          return dt, leap_second
docs: Convert to a Python ``datetime`` and leap second in a timezone.
  
          Convert this time to a Python ``datetime`` and a leap second::
  
              dt, leap_second = t.astimezone_and_leap_second(tz)
  
          The argument ``tz`` should be a timezone from the third-party
          ``pytz`` package, which must be installed separately.  The date
          and time returned will be for that time zone.
  
          The leap second value is provided because a Python ``datetime``
          can only number seconds ``0`` through ``59``, but leap seconds
          have a designation of at least ``60``.  The leap second return
          value will normally be ``0``, but will instead be ``1`` if the
          date and time are a UTC leap second.  Add the leap second value
          to the ``second`` field of the ``datetime`` to learn the real
          name of the second.
  
          If this time is an array, then an array of ``datetime`` objects
          and an array of leap second integers is returned, instead of a
          single value each.