{"record":{"id":"844da2a697172501","repo":"pydantic/monty","slug":"varargs-cannot-appear-after-keyword-only-fields-python-has","errorCode":null,"errorMessage":"`varargs` cannot appear after keyword-only fields — Python has no signature form with `*args` following keyword-only parameters","messagePattern":"`varargs` cannot appear after keyword-only fields — Python has no signature form with `\\*args` following keyword-only parameters","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"crates/monty-macros/src/from_args.rs","lineNumber":595,"sourceCode":"                        field.ident.span(),\n                        \"positional-or-keyword fields cannot appear after keyword-only fields\",\n                    ));\n                } else {\n                    seen_pos_or_kw = true;\n                }\n            }\n            FieldKind::KwOnly => {\n                seen_kw_only = true;\n            }\n            FieldKind::Varargs => {\n                if seen_varargs {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"only one `#[from_args(varargs)]` field is allowed\",\n                    ));\n                }\n                if seen_kw_only {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"`varargs` cannot appear after keyword-only fields — Python has no \\\n                         signature form with `*args` following keyword-only parameters\",\n                    ));\n                }\n                seen_varargs = true;\n                varargs_idx = Some(idx);\n            }\n            FieldKind::Varkwargs => {\n                if seen_varkwargs {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"only one `#[from_args(varkwargs)]` field is allowed\",\n                    ));\n                }\n                seen_varkwargs = true;\n                varkwargs_idx = Some(idx);\n            }","sourceCodeStart":577,"sourceCodeEnd":613,"githubUrl":"https://github.com/pydantic/monty/blob/adc986b362e3961f407868cb118a99fe831b9e61/crates/monty-macros/src/from_args.rs#L577-L613","documentation":"A compile-time error from the `FromArgs` derive macro. A `#[from_args(varargs)]` (`*args`) field must be declared before any keyword-only fields, because no Python signature can place `*args` after keyword-only parameters. The macro mirrors that constraint structurally and rejects the reversed order.","triggerScenarios":"Deriving `FromArgs` on a struct where a `#[from_args(kw_only)]` field appears before a `#[from_args(varargs)]` field.","commonSituations":"Appending a `*args`-style catch-all to a struct that already ends with keyword-only options; reordering fields and accidentally moving the varargs field below the kw_only block.","solutions":["Move the `#[from_args(varargs)]` field above all `#[from_args(kw_only)]` fields","If the field should collect keyword arguments instead, change it to `#[from_args(varkwargs)]`, which is allowed after keyword-only fields","If the trailing arguments are fixed, drop the varargs attribute and declare normal positional fields before the kw_only block"],"exampleFix":"// before\n#[derive(FromArgs)]\n#[from_args(name = \"f\"])\nstruct FArgs {\n    #[from_args(kw_only)]\n    flag: bool,\n    #[from_args(varargs)]\n    args: Vec<Value>,\n}\n\n// after\n#[derive(FromArgs)]\n#[from_args(name = \"f\"])\nstruct FArgs {\n    #[from_args(varargs)]\n    args: Vec<Value>,\n    #[from_args(kw_only)]\n    flag: bool,\n}","handlingStrategy":"validation","validationCode":"// varargs must precede all kw_only fields.\nfn varargs_before_kw_only(kinds: &[&str]) -> bool {\n    let first_kw_only = kinds.iter().position(|k| *k == \"kw_only\");\n    match first_kw_only {\n        Some(i) => !kinds[i..].contains(&\"varargs\"),\n        None => true,\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember Python's fixed signature order: pos-only, pos-or-kw, *args, kw-only, **kwargs","Place #[from_args(varargs)] in the middle of the struct, before the kw_only block","cargo check immediately after reordering fields"],"tags":["rust","derive-macro","compile-time","argument-parsing"],"backgroundTag":"schema-validation-failed","analyzedSha":"adc986b362e3961f407868cb118a99fe831b9e61","analyzedAt":"2026-09-13T19:19:18.698Z","contentChangedAt":"2026-09-13T19:19:18.698Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}