{"record":{"id":"8214222471ee64f4","repo":"apache/beam","slug":"value-coder-s","errorCode":null,"errorMessage":"value_coder: %s","messagePattern":"value_coder: (.+?)","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/coders/coders.py","lineNumber":268,"sourceCode":"    # type: (Type[CoderT], Any, CoderRegistry) -> CoderT\n    # If not overridden, just construct the coder without arguments.\n    return cls()\n\n  def is_kv_coder(self):\n    # type: () -> bool\n    return False\n\n  def key_coder(self):\n    # type: () -> Coder\n    if self.is_kv_coder():\n      raise NotImplementedError('key_coder: %s' % self)\n    else:\n      raise ValueError('Not a KV coder: %s.' % self)\n\n  def value_coder(self):\n    # type: () -> Coder\n    if self.is_kv_coder():\n      raise NotImplementedError('value_coder: %s' % self)\n    else:\n      raise ValueError('Not a KV coder: %s.' % self)\n\n  def _get_component_coders(self):\n    # type: () -> Sequence[Coder]\n\n    \"\"\"For internal use only; no backwards-compatibility guarantees.\n\n    Returns the internal component coders of this coder.\"\"\"\n    # This is an internal detail of the Coder API and does not need to be\n    # refined in user-defined Coders.\n    return []\n\n  def __repr__(self):\n    return self.__class__.__name__\n\n  # pylint: disable=protected-access\n  def __eq__(self, other):","sourceCodeStart":250,"sourceCodeEnd":286,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/coders/coders.py#L250-L286","documentation":"Mirror of key_coder(): Coder.value_coder() raises NotImplementedError when the coder says it is a KV coder but does not implement the value-component access in the base class. The base class provides no value coder, so subclasses must implement it.","triggerScenarios":"Calling value_coder() on a custom coder whose is_kv_coder() returns True without an overridden value_coder/_get_component_coders; framework probes during grouping or runner planning.","commonSituations":"Custom KV coders missing the component coder API; base Coder used where TupleCoder was intended.","solutions":["Override value_coder()/key_coder() or _get_component_coders() in the custom coder","Use coders.TupleCoder for KV data","Fix is_kv_coder() to return False if the coder truly has no value component"],"exampleFix":"// before\nclass MyKVCoder(Coder):\n    pass  # is_kv_coder() defaults truthy path\n// after\nclass MyKVCoder(Coder):\n    def value_coder(self):\n        return coders.StrBytesCoder()","handlingStrategy":"type-guard","validationCode":"if coder.is_kv_coder() and type(coder).value_coder is Coder.value_coder:\n    raise TypeError('coder claims KV but lacks value_coder')","typeGuard":"def has_value_coder(coder):\n    return coder.is_kv_coder() and type(coder).value_coder is not Coder.value_coder","tryCatchPattern":"try:\n    vc = coder.value_coder()\nexcept NotImplementedError as e:\n    log.error('no value coder for %s: %s', coder, e)\n    vc = default_value_coder","preventionTips":["Implement the full component-coder API in custom KV coders","Use TupleCoder instead of hand-rolled KV coders","Unit-test key_coder()/value_coder() on custom coders"],"tags":["python","apache-beam","coders","kv"],"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-14T16:17:12.679Z"}