{"record":{"id":"8c72162aaf8ddb04","repo":"apache/beam","slug":"s-do-not-process-elements","errorCode":null,"errorMessage":"%s do not process elements.","messagePattern":"(.+?) do not process elements\\.","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/runners/direct/transform_evaluator.py","lineNumber":317,"sourceCode":"    \"\"\"\n    state = self._step_context.get_keyed_state(timer_firing.encoded_key)\n    state.clear_timer(\n        timer_firing.window,\n        timer_firing.name,\n        timer_firing.time_domain,\n        dynamic_timer_tag=timer_firing.dynamic_timer_tag)\n    self.process_timer(timer_firing)\n\n  def process_timer(self, timer_firing):\n    \"\"\"Default process_timer() impl. generating KeyedWorkItem element.\"\"\"\n    self.process_element(\n        GlobalWindows.windowed_value(\n            KeyedWorkItem(\n                timer_firing.encoded_key, timer_firings=[timer_firing])))\n\n  def process_element(self, element):\n    \"\"\"Processes a new element as part of the current bundle.\"\"\"\n    raise NotImplementedError('%s do not process elements.' % type(self))\n\n  def finish_bundle(self) -> TransformResult:\n    \"\"\"Finishes the bundle and produces output.\"\"\"\n    pass\n\n\nclass _BoundedReadEvaluator(_TransformEvaluator):\n  \"\"\"TransformEvaluator for bounded Read transform.\"\"\"\n\n  # After some benchmarks, 1000 was optimal among {100,1000,10000}\n  MAX_ELEMENT_PER_BUNDLE = 1000\n\n  def __init__(\n      self,\n      evaluation_context,\n      applied_ptransform,\n      input_committed_bundle,\n      side_inputs):","sourceCodeStart":299,"sourceCodeEnd":335,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/runners/direct/transform_evaluator.py#L299-L335","documentation":"_TransformEvaluator (and subclasses that inherit its base) only handles timer firings; the base class explicitly refuses to process data elements. Calling process_element on such an evaluator always raises NotImplementedError naming the evaluator type.","triggerScenarios":"An element from an input bundle is fed to an evaluator type that only supports timers (e.g. a timer-only transform's evaluator), i.e. wiring input PCollections into a transform whose evaluator class doesn't override process_element.","commonSituations":"Building a custom transform/evaluator and forgetting to override process_element; internal wiring mistakes where a data input reaches a timer-handling evaluator; framework-level misuse during custom runner extension.","solutions":["Override process_element in your evaluator subclass if it should consume elements.","Don't connect an input PCollection to a transform that only processes timers.","Use a different evaluator/transform appropriate for element-wise processing (e.g. a ParDo evaluator)."],"exampleFix":"# before\nclass MyEvaluator(_TransformEvaluator):\n    pass\n# after\nclass MyEvaluator(_TransformEvaluator):\n    def process_element(self, element):\n        ...  # handle the element","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"def evaluator_accepts_elements(evaluator) -> bool:\n    return type(evaluator).process_element is not _TransformEvaluator.process_element","tryCatchPattern":"try:\n    evaluator.process_element(element)\nexcept NotImplementedError as e:\n    # route to a timer-only evaluator or fix the wiring\n    ...","preventionTips":["Override process_element in any custom evaluator meant to consume elements.","Don't connect data inputs to timer-only transforms.","Unit-test evaluators with both element and timer inputs."],"tags":["python","apache-beam","directrunner","evaluator"],"backgroundTag":"method-not-implemented","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}