docstr: Tests whether a given filter expression string is valid, e.g. that
  the filter term is not None or an unparsable date/datetime.  `null`/
  `not null` operators don't need a comparison value.
  
  Args:
      filter (:obj:`string`): The filter expression to validate.
  
  Returns:
      :obj:`bool`: Whether this filter is valid.
docstr_tok: ["Tests","whether","a","given","filter","expression","string","is","valid",",","e.g",".","that","the","filter","term","is","not","None","or","an","unparsable","date\/datetime",".","`","null","`","\/","`","not","null","`","operators","do","n't","need","a","comparison","value",".","Args",":","filter","(",":","obj",":","`","string","`",")",":","The","filter","expression","to","validate",".","Returns",":",":","obj",":","`","bool","`",":","Whether","this","filter","is","valid","."]
code: def is_valid_filter(self, filter):
      """Tests whether a given filter expression string is valid, e.g. that
      the filter term is not None or an unparsable date/datetime.  `null`/
      `not null` operators don't need a comparison value.
  
      Args:
          filter (:obj:`string`): The filter expression to validate.
  
      Returns:
          :obj:`bool`: Whether this filter is valid.
      """
      if isinstance(filter[1], str):
          filter_op = str_to_filter_op(filter[1])
      else:
          filter_op = filter[1]
  
      if (
          filter_op == t_filter_op.FILTER_OP_IS_NULL
          or filter_op == t_filter_op.FILTER_OP_IS_NOT_NULL
      ):
          # null/not null operators don't need a comparison value
          return True
  
      value = filter[2]
  
      if value is None:
          return False
  
      schema = self.schema()
      in_schema = schema.get(filter[0], None)
      if in_schema and (
          schema[filter[0]] == date or schema[filter[0]] == datetime
      ):
          if isinstance(value, str):
              value = self._date_validator.parse(value)
  
      return value is not None
  
imports: from datetime import date, datetime
  from ..core.exception import PerspectiveError
  from ._accessor import _PerspectiveAccessor
  from ._callback_cache import _PerspectiveCallBackCache
  from ._date_validator import _PerspectiveDateValidator
  from ._state import _PerspectiveStateManager
  from ._utils import _dtype_to_pythontype, _dtype_to_str, _parse_expression_inputs, _str_to_pythontype
  from .libpsppy import make_table, update_table, str_to_filter_op, t_dtype, t_filter_op, t_op, validate_expressions
  from .view import View
label_desc: Use image node_id 15 for calling the Table obj's underlying member method code with example usage: obj.is_valid_filter(filter) and returns: unknown, True, False