class_docstr: Adds special handling for K8s executor config.
  
  If we unpickle a k8s object that was pickled under an earlier k8s library version, then
  the unpickled object may throw an error when to_dict is called.  To be more tolerant of
  version changes we convert to JSON using Airflow's serializer before pickling.
class_docstr_tok: ["Adds","special","handling","for","K8s","executor","config",".","If","we","unpickle","a","k8s","object","that","was","pickled","under","an","earlier","k8s","library","version",",","then","the","unpickled","object","may","throw","an","error","when","to_dict","is","called",".","To","be","more","tolerant","of","version","changes","we","convert","to","JSON","using","Airflow","'s","serializer","before","pickling","."]
docstr: The TaskInstance.executor_config attribute is a pickled object that may contain kubernetes objects.
  
  If the installed library version has changed since the object was originally pickled,
  due to the underlying ``__eq__`` method on these objects (which converts them to JSON),
  we may encounter attribute errors. In this case we should replace the stored object.
  
  From https://github.com/apache/airflow/pull/24356 we use our serializer to store
  k8s objects, but there could still be raw pickled k8s objects in the database,
  stored from earlier version, so we still compare them defensively here.
code: def compare_values(self, x, y):
      """
      The TaskInstance.executor_config attribute is a pickled object that may contain kubernetes objects.
  
      If the installed library version has changed since the object was originally pickled,
      due to the underlying ``__eq__`` method on these objects (which converts them to JSON),
      we may encounter attribute errors. In this case we should replace the stored object.
  
      From https://github.com/apache/airflow/pull/24356 we use our serializer to store
      k8s objects, but there could still be raw pickled k8s objects in the database,
      stored from earlier version, so we still compare them defensively here.
      """
      if self.comparator:
          return self.comparator(x, y)
      else:
          try:
              return x == y
          except AttributeError:
              return False
  
imports: from __future__ import annotations
  import contextlib
  import copy
  import datetime
  import json
  import logging
  from typing import TYPE_CHECKING, Any, Generator, Iterable, overload
  from dateutil import relativedelta
  from sqlalchemy import TIMESTAMP, PickleType, event, nullsfirst, tuple_
  from sqlalchemy.dialects import mysql
  from sqlalchemy.types import JSON, Text, TypeDecorator
  from airflow.configuration import conf
  from airflow.serialization.enums import Encoding
  from airflow.utils.timezone import make_naive, utc
label_desc: Use image node_id 3 for calling the ExecutorConfigType obj's underlying member method code with example usage: obj.compare_values(x, y) and returns: self, unknown, False