{"record":{"id":"8d777362ad79f221","repo":"pathwaycom/pathway","slug":"column-name-should-be-a-column-definition-fou","errorCode":null,"errorMessage":"`{column_name}` should be a column definition, found {type(column)}","messagePattern":"`(.+?)` should be a column definition, found (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/pathway/internals/schema.py","lineNumber":208,"sourceCode":"    #  Update locals to handle recursive Schema definitions\n    localns[schema.__name__] = schema\n    annotations = get_type_hints(schema, localns=localns)\n    fields = _cls_fields(schema)\n    for base in bases:\n        if not isinstance(base, SchemaMetaclass):\n            continue\n        for column_name, column_schema in base.__columns__.items():\n            if column_name not in fields:\n                fields[column_name] = column_schema.to_definition()\n\n    columns = {}\n\n    for column_name, annotation in annotations.items():\n        col_dtype = dt.wrap(annotation)\n        column = fields.pop(column_name, column_definition(dtype=col_dtype))\n\n        if not isinstance(column, ColumnDefinition):\n            raise ValueError(\n                f\"`{column_name}` should be a column definition, found {type(column)}\"\n            )\n\n        dtype = column.dtype\n        if dtype is None:\n            dtype = col_dtype\n\n        if col_dtype != dtype:\n            raise TypeError(\n                f\"type annotation of column `{column_name}` does not match column definition\"\n            )\n\n        column_name = column.name or column_name\n\n        def _get_column_property(property_name: str, default: Any) -> Any:\n            match (\n                getattr(column, property_name),\n                getattr(schema_properties, property_name),","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/pathwaycom/pathway/blob/fa2f74a4649b7c5908690cf60137263d8d80de5f/python/pathway/internals/schema.py#L190-L226","documentation":"When building a schema, each annotated column may only be assigned a column_definition(...) object. After dt.wrap of the annotation, the code pops the class-level field value and checks isinstance(column, ColumnDefinition); assigning anything else (a plain type, a tuple, a ColumnSchema, a default value directly) raises this ValueError.","triggerScenarios":"Writing class MySchema(pw.Schema): age: int = 42 or age: int = int (instead of column_definition(dtype=int, default_value=42)); also assigning a ColumnSchema object copied from another schema's columns() mapping.","commonSituations":"Trying to declare default values directly (pw.Schema requires column_definition(default_value=...)); migrating old ColumnSchema-based code; assigning dataclass-like sentinel values.","solutions":["Wrap any per-column option in column_definition: age: int = pw.column_definition(default_value=42).","Do not assign raw types or values to annotated attributes; an annotation alone (age: int) is sufficient when no options are needed.","When deriving schemas programmatically, convert ColumnSchema back with .to_definition() before passing into schema_builder."],"exampleFix":"# before\nclass MySchema(pw.Schema):\n    age: int = 42\n\n# after\nclass MySchema(pw.Schema):\n    age: int = pw.column_definition(default_value=42)","handlingStrategy":"type-guard","validationCode":"from pathway.internals.schema import column_definition, ColumnDefinition\n\ndef is_valid_column_value(v) -> bool:\n    return v is None or isinstance(v, ColumnDefinition)","typeGuard":"from pathway.internals.schema import ColumnDefinition\nfrom typing import TypeGuard\n\ndef is_column_definition(v) -> TypeGuard[ColumnDefinition]:\n    return isinstance(v, ColumnDefinition)","tryCatchPattern":null,"preventionTips":["Only ever assign column_definition(...) (or nothing) to annotated schema attributes.","Use default_value= inside column_definition for defaults, never a bare value."],"tags":["pathway","schema","column-definition","type-annotation"],"backgroundTag":null,"analyzedSha":"fa2f74a4649b7c5908690cf60137263d8d80de5f","analyzedAt":"2026-08-15T01:48:17.006Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}