code: def try_to_promote_types(
      self,
      block_indexes: List[int],
      block_type: Union[bool, list, int, float, np.dtype, BlockType],
  ) -> List[Tuple[int, BlockType]]:
      promote_types = []
      if isinstance(block_type, (bool, int, float, np.dtype)):
          block_type = BlockType.get_block_type(block_type)
  
      if isinstance(block_type, BlockType):
          for idx, bid in enumerate(block_indexes):
              if self.get_block(bid).block_type < block_type:
                  promote_types.append((bid, block_type))
      else:
          for idx, (bid, r_type) in enumerate(
              zip(block_indexes, block_type)
          ):
              block_type = BlockType.get_block_type(r_type)
              if self.get_block(bid).block_type < block_type:
                  promote_types.append((bid, block_type))
  
      return promote_types
  
imports: import numpy
  from .schema_manager import SchemaManager
  from .block_manager import BlockManager
  from .block_manager import BlockType
  import pandas
  from ..entity import types
  from typing import Union, List, Tuple
  from ..conf.default_config import DATAFRAME_BLOCK_ROW_SIZE
label_desc: Use image node_id 26 for calling the DataManager obj's underlying member method code with example usage: obj.try_to_promote_types(block_indexes, block_type) and returns: promote_types