code: def maybe_upcast(values, fill_value=np.nan, dtype=None, copy=False):
      
  
      if is_extension_type(values):
          if copy:
              values = values.copy()
      else:
          if dtype is None:
              dtype = values.dtype
          new_dtype, fill_value = maybe_promote(dtype, fill_value)
          if new_dtype != values.dtype:
              values = values.astype(new_dtype)
          elif copy:
              values = values.copy()
  
      return values, fill_value
docs: provide explicit type promotion and coercion
  
      Parameters
      ----------
      values : the ndarray that we want to maybe upcast
      fill_value : what we want to fill with
      dtype : if None, then use the dtype of the values, else coerce to this type
      copy : if True always make a copy even if no upcast is required