{"record":{"id":"37b990c7f8dd12d1","repo":"google/python-fire","slug":"unexpected-kwargs-present","errorCode":null,"errorMessage":"Unexpected kwargs present:","messagePattern":"Unexpected kwargs present:","errorType":"exception","errorClass":"FireError","httpStatus":null,"severity":"error","filePath":"fire/core.py","lineNumber":739,"sourceCode":"  num_required_args = len(fn_spec.args) - len(fn_spec.defaults)\n  required_kwonly = set(fn_spec.kwonlyargs) - set(fn_spec.kwonlydefaults)\n\n  def _ParseFn(args):\n    \"\"\"Parses the list of `args` into (varargs, kwargs), remaining_args.\"\"\"\n    kwargs, remaining_kwargs, remaining_args = _ParseKeywordArgs(args, fn_spec)\n\n    # Note: _ParseArgs modifies kwargs.\n    parsed_args, kwargs, remaining_args, capacity = _ParseArgs(\n        fn_spec.args, fn_spec.defaults, num_required_args, kwargs,\n        remaining_args, metadata)\n\n    if fn_spec.varargs or fn_spec.varkw:\n      # If we're allowed *varargs or **kwargs, there's always capacity.\n      capacity = True\n\n    extra_kw = set(kwargs) - set(fn_spec.kwonlyargs)\n    if fn_spec.varkw is None and extra_kw:\n      raise FireError('Unexpected kwargs present:', extra_kw)\n\n    missing_kwonly = set(required_kwonly) - set(kwargs)\n    if missing_kwonly:\n      raise FireError('Missing required flags:', missing_kwonly)\n\n    # If we accept *varargs, then use all remaining arguments for *varargs.\n    if fn_spec.varargs is not None:\n      varargs, remaining_args = remaining_args, []\n    else:\n      varargs = []\n\n    for index, value in enumerate(varargs):\n      varargs[index] = _ParseValue(value, None, None, metadata)\n\n    varargs = parsed_args + varargs\n    remaining_args += remaining_kwargs\n\n    consumed_args = args[:len(args) - len(remaining_args)]","sourceCodeStart":721,"sourceCodeEnd":757,"githubUrl":"https://github.com/google/python-fire/blob/716bbc23d7eca949fdb682172283c8d18f742cb6/fire/core.py#L721-L757","documentation":"When calling a function, Fire collects keyword flags into kwargs. If the function's signature has no **kwargs catch-all (varkw is None) and the caller supplied keyword flags that aren't among the function's keyword-only parameters, FireError('Unexpected kwargs present:', extra_kw) is raised listing the offending names.","triggerScenarios":"Calling fn(a, b, *, c=None) with an extra --d=3 flag; passing a misspelled keyword flag (mytool run --tyep=fast); passing flags meant for another command in the chain.","commonSituations":"Typos in flag names; changed function signatures after removing/renaming keyword-only params; scripts caching old flag sets.","solutions":["Remove or correct the unexpected flag name","Add **kwargs to the function signature to absorb extra flags","Check --help output for the accepted flags"],"exampleFix":"// before\ndef run(speed, *, verbose=None): ...  # invoked: run --spead=5\n// after\ndef run(speed, *, verbose=None, **kwargs): ...  # or fix flag spelling: run --speed=5","handlingStrategy":"validation","validationCode":"extra = set(supplied_flags) - set(inspect.signature(fn).parameters)\nspec = inspect.signature(fn)\naccepts_kw = any(p.kind == p.VAR_KEYWORD for p in spec.parameters.values())\nif extra and not accepts_kw:\n    raise TypeError(f'unknown flags: {extra}')","typeGuard":"def flags_accepted(fn, flags) -> bool:\n    params = inspect.signature(fn).parameters\n    return not flags or any(p.kind == p.VAR_KEYWORD for p in params.values()) or set(flags) <= set(params)","tryCatchPattern":"try:\n    fire.Fire(component)\nexcept fire.core.FireError as e:\n    if 'Unexpected kwargs present' in str(e):\n        print('unknown flag; check -- --help', file=sys.stderr)\n        sys.exit(2)\n    raise","preventionTips":["Cross-check script flag names against fn signature after refactors","Add **kwargs only deliberately; otherwise let Fire surface typos","Keep flags kebab/dash conventions consistent with parameter names"],"tags":["python","cli","kwargs","signature-mismatch"],"backgroundTag":"unexpected-keyword-argument","analyzedSha":"716bbc23d7eca949fdb682172283c8d18f742cb6","analyzedAt":"2026-08-28T21:57:47.200Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}