code: def polygon_to_geohashes(polygon, precision, inner=True):
      
      inner_geohashes = set()
      outer_geohashes = set()
  
      envelope = polygon.envelope
      centroid = polygon.centroid
  
      testing_geohashes = queue.Queue()
      testing_geohashes.put(geohash.encode(centroid.y, centroid.x, precision))
  
      while not testing_geohashes.empty():
          current_geohash = testing_geohashes.get()
  
          if current_geohash not in inner_geohashes and current_geohash not in outer_geohashes:
              current_polygon = geohash_to_polygon(current_geohash)
  
              condition = envelope.contains(current_polygon) if inner else envelope.intersects(current_polygon)
  
              if condition:
                  if inner:
                      if polygon.contains(current_polygon):
                          inner_geohashes.add(current_geohash)
                      else:
                          outer_geohashes.add(current_geohash)
                  else:
                      if polygon.intersects(current_polygon):
                          inner_geohashes.add(current_geohash)
                      else:
                          outer_geohashes.add(current_geohash)
                  for neighbor in geohash.neighbors(current_geohash):
                      if neighbor not in inner_geohashes and neighbor not in outer_geohashes:
                          testing_geohashes.put(neighbor)
  
      return inner_geohashes
docs: :param polygon: shapely polygon.
      :param precision: int. Geohashes' precision that form resulting polygon.
      :param inner: bool, default 'True'. If false, geohashes that are completely outside from the polygon are ignored.
      :return: set. Set of geohashes that form the polygon.