class_docstr: 该 callback 不直接进行使用，作为其它相关 callback 的父类使用，如果 callback 有使用 monitor 可以继承该函数里面实现了
  （1）判断 monitor 合法性；（2）在需要时， 根据 trainer 的 monitor 设置自己的 monitor 名称。
  
  :param monitor: 监控的 metric 值：
  
      * 为 ``None``
       将尝试使用 :class:`~fastNLP.core.controllers.Trainer` 中设置 `monitor` 值（如果有设置）；
      * 为 ``str``
       尝试直接使用该名称从 ``evaluation`` 结果中寻找，如果在 ``evaluation`` 结果中没有找到完全一致的名称，将
       使用 最长公共字符串算法 从 ``evaluation`` 结果中找到最匹配的那个作为 ``monitor`` ；
      * 为 :class:`Callable`
       接受参数为 ``evaluation`` 的结果(字典类型)，返回一个 ``float`` 值作为 ``monitor`` 的结果，如果当前结果中没有相关
       的 ``monitor`` 值请返回 ``None`` ；
  :param larger_better: monitor 是否为越大越好；
  :param must_have_monitor: 这个 callback 是否必须有 monitor 设置。如果设置为 ``True`` ，且没检测到设置 monitor 会报错；
code: def on_sanity_check_end(self, trainer, sanity_check_res):
      # 主要核对一下 monitor 是否存在。
      if self.monitor is not None:
          self.get_monitor_value(results=sanity_check_res)
  
imports: from typing import Dict, Union, Any
  from abc import ABC
  import functools
  from fastNLP.core.utils import apply_to_collection
  from fastNLP.core.callbacks import Callback
  from fastNLP.core.callbacks.utils import _get_monitor_value
  from fastNLP.core.log import logger
  from fastNLP.core.utils.utils import _check_valid_parameters_number
label_desc: Use image node_id 3 for calling the HasMonitorCallback obj's underlying member method code with example usage: obj.on_sanity_check_end(trainer, sanity_check_res) without return types