class_docstr: Waits for a Python callable to return True.
  
  User could put input argument in templates_dict
  e.g ``templates_dict = {'start_ds': 1970}``
  and access the argument by calling ``kwargs['templates_dict']['start_ds']``
  in the callable
  
  :param python_callable: A reference to an object that is callable
  :param op_kwargs: a dictionary of keyword arguments that will get unpacked
      in your function
  :param op_args: a list of positional arguments that will get unpacked when
      calling your callable
  :param templates_dict: a dictionary where the values are templates that
      will get templated by the Airflow engine sometime between
      ``__init__`` and ``execute`` takes place and are made available
      in your callable's context after the template has been applied.
  
  .. seealso::
      For more information on how to use this sensor, take a look at the guide:
      :ref:`howto/operator:PythonSensor`
code: def poke(self, context: Context) -> PokeReturnValue | bool:
      context_merge(
          context, self.op_kwargs, templates_dict=self.templates_dict
      )
      self.op_kwargs = determine_kwargs(
          self.python_callable, self.op_args, context
      )
  
      self.log.info("Poking callable: %s", str(self.python_callable))
      return_value = self.python_callable(
          *self.op_args, **self.op_kwargs
      )
      if isinstance(return_value, PokeReturnValue):
          return return_value
      else:
          return PokeReturnValue(bool(return_value))
  
file_path: airflow/airflow/sensors/python.py
imports: from __future__ import annotations
  from typing import TYPE_CHECKING, Any, Callable, Mapping, Sequence
  from airflow.sensors.base import BaseSensorOperator, PokeReturnValue
  from airflow.utils.context import context_merge
  from airflow.utils.operator_helpers import determine_kwargs
label_desc: Use image node_id 2 for calling the PythonSensor obj's underlying member method code with example usage: obj.poke(context) and returns: return_value, PokeReturnValue