{"record":{"id":"b3b028c4f65ff3a7","repo":"apache/beam","slug":"parameter-name-cannot-be-empty","errorCode":null,"errorMessage":"Parameter name cannot be empty","messagePattern":"Parameter name cannot be empty","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/transforms/external.py","lineNumber":146,"sourceCode":"    :return: ExternalConfigurationPayload\n    \"\"\"\n    raise NotImplementedError\n\n  def payload(self):\n    \"\"\"\n    The serialized ExternalConfigurationPayload\n\n    :return: bytes\n    \"\"\"\n    return self.build().SerializeToString()\n\n  def _get_schema_proto_and_payload(self, **kwargs):\n    named_fields = []\n    fields_to_values = OrderedDict()\n\n    for key, value in kwargs.items():\n      if not key:\n        raise ValueError('Parameter name cannot be empty')\n      if value is None:\n        raise ValueError(\n            'Received value None for key %s. None values are currently not '\n            'supported' % key)\n      named_fields.append(\n          (key, convert_to_typing_type(instance_to_type(value))))\n      fields_to_values[key] = value\n\n    schema_proto = named_fields_to_schema(named_fields)\n    row = named_tuple_from_schema(schema_proto)(**fields_to_values)\n    schema = named_tuple_to_schema(type(row))\n\n    payload = RowCoder(schema).encode(row)\n    return (schema_proto, payload)\n\n\nclass SchemaBasedPayloadBuilder(PayloadBuilder):\n  \"\"\"","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/transforms/external.py#L128-L164","documentation":"When building a cross-language (Java) transform via SchemaTransform, each keyword argument to build() becomes a named schema field. Beam raises this ValueError if a keyword argument's name is empty, because a schema field cannot have an empty identifier.","triggerScenarios":"Calling builder.build(**kwargs) where one of the kwargs keys is an empty string, typically via **{'': value} or dynamically constructed parameter names.","commonSituations":"Programmatically building kwargs from config dictionaries or parsed identifiers where a key was dropped or defaulted to empty string.","solutions":["Fix the source dict/config so every key is a non-empty parameter name.","Filter out empty keys before calling build().","Check for typos or failed string interpolation producing '' as a key."],"exampleFix":"# before\nbuilder.build(**{name: value for name, value in params.items() if name in keep})  # '' slips through\n# after\nbuilder.build(**{name: value for name, value in params.items() if name and name in keep})","handlingStrategy":"validation","validationCode":"bad = [k for k in kwargs if not k]\nif bad:\n    raise ValueError('empty parameter names: %r' % bad)\nbuilder.build(**kwargs)","typeGuard":"def valid_kwargs(kwargs) -> bool:\n    return all(isinstance(k, str) and k for k in kwargs)","tryCatchPattern":"try:\n    builder.build(**kwargs)\nexcept ValueError as e:\n    if 'Parameter name cannot be empty' in str(e):\n        kwargs = {k: v for k, v in kwargs.items() if k}\n        builder.build(**kwargs)\n    else:\n        raise","preventionTips":["Validate dynamically built kwargs keys before build().","Never spread dicts with possibly-empty keys via **.","Log the kwargs dict when building transforms programmatically."],"tags":["python","apache-beam","cross-language","validation"],"backgroundTag":"empty-required-field","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"}