{"id":"b4601ed8362548eb","repo":"pydantic/pydantic","slug":"positional-only-argument-plural-passed-as-keyword-b4601e","errorCode":null,"errorMessage":"positional-only argument{plural} passed as keyword argument{plural}: {keys}","messagePattern":"positional-only argument(.+?) passed as keyword argument(.+?): (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pydantic/v1/decorator.py","lineNumber":250,"sourceCode":"                raise TypeError(f'{pos_args} positional arguments expected but {pos_args + len(v)} given')\n\n            @validator(self.v_kwargs_name, check_fields=False, allow_reuse=True)\n            def check_kwargs(cls, v: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:\n                if takes_kwargs or v is None:\n                    return v\n\n                plural = '' if len(v) == 1 else 's'\n                keys = ', '.join(map(repr, v.keys()))\n                raise TypeError(f'unexpected keyword argument{plural}: {keys}')\n\n            @validator(V_POSITIONAL_ONLY_NAME, check_fields=False, allow_reuse=True)\n            def check_positional_only(cls, v: Optional[List[str]]) -> None:\n                if v is None:\n                    return\n\n                plural = '' if len(v) == 1 else 's'\n                keys = ', '.join(map(repr, v))\n                raise TypeError(f'positional-only argument{plural} passed as keyword argument{plural}: {keys}')\n\n            @validator(V_DUPLICATE_KWARGS, check_fields=False, allow_reuse=True)\n            def check_duplicate_kwargs(cls, v: Optional[List[str]]) -> None:\n                if v is None:\n                    return\n\n                plural = '' if len(v) == 1 else 's'\n                keys = ', '.join(map(repr, v))\n                raise TypeError(f'multiple values for argument{plural}: {keys}')\n\n            class Config(CustomConfig):\n                extra = getattr(CustomConfig, 'extra', Extra.forbid)\n\n        self.model = create_model(to_camel(self.raw_function.__name__), __base__=DecoratorBaseModel, **fields)\n","sourceCodeStart":232,"sourceCodeEnd":265,"githubUrl":"https://github.com/pydantic/pydantic/blob/2e5f0e2b4218de31709f1cf9c5bc61ea97a68835/pydantic/v1/decorator.py#L232-L265","documentation":"Raised at call time by the check_positional_only validator when a @validate_arguments-decorated function declares positional-only parameters (using / in the signature, or C-style positional-only) and the caller passes one of them as a keyword argument. build_values detects such keys and stores them in V_POSITIONAL_ONLY_NAME; the validator then raises.","triggerScenarios":"A function with positional-only params (def f(a, b, /)) decorated with @validate_arguments, called as f(1, b=2) — passing a positional-only arg 'b' by keyword.","commonSituations":"Migrating a function to positional-only syntax with /; calling a library function whose signature was tightened to positional-only; forwarding kwargs that include a positional-only name.","solutions":["Pass positional-only arguments positionally, not by keyword.","If keyword usage is required, remove the '/' positional-only marker from the signature."],"exampleFix":"// before\n@validate_arguments\ndef f(a: int, b: int, /): ...\nf(1, b=2)  # raises: positional-only argument passed as keyword: 'b'\n\n# after\nf(1, 2)  # pass positionally","handlingStrategy":"validation","validationCode":"import inspect\n\ndef _enforce_positional_only(func, args, kwargs):\n    params = inspect.signature(func).parameters\n    pos_only = {n for n, p in params.items() if p.kind == p.POSITIONAL_ONLY}\n    clash = set(kwargs) & pos_only\n    if clash:\n        raise TypeError(f'pass these positionally, not by keyword: {clash}')","typeGuard":"import inspect\n\ndef no_positional_only_as_keyword(func, kwargs) -> bool:\n    params = inspect.signature(func).parameters\n    pos_only = {n for n, p in params.items() if p.kind == p.POSITIONAL_ONLY}\n    return set(kwargs).isdisjoint(pos_only)","tryCatchPattern":"try:\n    result = wrapped_fn(*args, **kwargs)\nexcept TypeError as e:\n    if 'positional-only' in str(e):\n        # move clashing kwargs into positional order\n        ...","preventionTips":["Document positional-only params clearly in docstrings.","Avoid forwarding external kwargs into functions with positional-only params.","Consider dropping the '/' marker if keyword usage is common."],"tags":["pydantic-v1","validate-arguments","arguments","positional-only"],"analyzedSha":"2e5f0e2b4218de31709f1cf9c5bc61ea97a68835","analyzedAt":"2026-08-04T19:54:21.281Z","schemaVersion":2}