docs: def humanize_bytes(b, precision=1):
      """Return a humanized string representation of a number of b.
  
      Assumes `from __future__ import division`.
  
      >>> humanize_bytes(1)
      '1 byte'
      >>> humanize_bytes(1024)
      '1.0 kB'
      >>> humanize_bytes(1024*123)
      '123.0 kB'
      >>> humanize_bytes(1024*12342)
      '12.1 MB'
      >>> humanize_bytes(1024*12342,2)
      '12.05 MB'
      >>> humanize_bytes(1024*1234,2)
      '1.21 MB'
      >>> humanize_bytes(1024*1234*1111,2)
      '1.31 GB'
      >>> humanize_bytes(1024*1234*1111,1)
      '1.3 GB'
      """
      # abbrevs = (
      #     (1 << 50L, 'PB'),
      #     (1 << 40L, 'TB'),
      #     (1 << 30L, 'GB'),
      #     (1 << 20L, 'MB'),
      #     (1 << 10L, 'kB'),
      #     (1, 'b')
      # )
      abbrevs = (
          (1 << 50, 'PB'),
          (1 << 40, 'TB'),
          (1 << 30, 'GB'),
          (1 << 20, 'MB'),
          (1 << 10, 'kB'),
          (1, 'b')
      )
      if b == 1:
          return '1 byte'
      for factor, suffix in abbrevs:
          if b >= factor:
              break
      # return '%.*f %s' % (precision, old_div(b, factor), suffix)
      return '%.*f %s' % (precision, b // factor, suffix)