[{"data":1,"prerenderedAt":868},["ShallowReactive",2],{"blog-\u002Fblog\u002Fpython-function-arguments-args-kwargs-explained":3},{"id":4,"title":5,"body":6,"description":854,"difficulty":855,"extension":856,"framework":857,"frameworkSlug":39,"meta":858,"navigation":102,"order":63,"path":859,"qaPath":860,"seo":861,"stem":862,"subtopic":863,"topic":864,"topicSlug":865,"updated":866,"__hash__":867},"blog\u002Fblog\u002Fpython-function-arguments-args-kwargs-explained.md","Python Function Arguments Explained — *args, **kwargs, Defaults, and Keyword-Only",{"type":7,"value":8,"toc":842},"minimark",[9,14,27,31,34,152,155,159,166,242,246,261,330,337,393,397,407,474,478,487,545,557,561,571,650,654,665,742,746,749,787,790,794,838],[10,11,13],"h2",{"id":12},"python-function-arguments-explained","Python function arguments, explained",[15,16,17,18,22,23,26],"p",{},"Python's argument system is unusually flexible — positional, keyword, variadic,\nkeyword-only, positional-only — and that flexibility is a frequent interview topic. Get the\n",[19,20,21],"strong",{},"order"," and the ",[19,24,25],{},"mutable-default trap"," right and you'll handle almost any signature\nquestion.",[10,28,30],{"id":29},"positional-vs-keyword-arguments","Positional vs keyword arguments",[15,32,33],{},"When calling a function, you can pass arguments by position or by name:",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-python shiki shiki-themes github-light github-dark","def greet(name, greeting):\n    return f\"{greeting}, {name}\"\n\ngreet(\"Ada\", \"Hi\")              # positional — order matters\ngreet(greeting=\"Hi\", name=\"Ada\")   # keyword — order doesn't, clarity wins\n","python","",[42,43,44,61,97,104,125],"code",{"__ignoreMap":40},[45,46,49,53,57],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"szBVR","def",[45,54,56],{"class":55},"sScJk"," greet",[45,58,60],{"class":59},"sVt8B","(name, greeting):\n",[45,62,64,67,70,74,78,81,84,87,89,92,94],{"class":47,"line":63},2,[45,65,66],{"class":51},"    return",[45,68,69],{"class":51}," f",[45,71,73],{"class":72},"sZZnC","\"",[45,75,77],{"class":76},"sj4cs","{",[45,79,80],{"class":59},"greeting",[45,82,83],{"class":76},"}",[45,85,86],{"class":72},", ",[45,88,77],{"class":76},[45,90,91],{"class":59},"name",[45,93,83],{"class":76},[45,95,96],{"class":72},"\"\n",[45,98,100],{"class":47,"line":99},3,[45,101,103],{"emptyLinePlaceholder":102},true,"\n",[45,105,107,110,113,115,118,121],{"class":47,"line":106},4,[45,108,109],{"class":59},"greet(",[45,111,112],{"class":72},"\"Ada\"",[45,114,86],{"class":59},[45,116,117],{"class":72},"\"Hi\"",[45,119,120],{"class":59},")              ",[45,122,124],{"class":123},"sJ8bj","# positional — order matters\n",[45,126,128,130,133,136,138,140,142,144,146,149],{"class":47,"line":127},5,[45,129,109],{"class":59},[45,131,80],{"class":132},"s4XuR",[45,134,135],{"class":51},"=",[45,137,117],{"class":72},[45,139,86],{"class":59},[45,141,91],{"class":132},[45,143,135],{"class":51},[45,145,112],{"class":72},[45,147,148],{"class":59},")   ",[45,150,151],{"class":123},"# keyword — order doesn't, clarity wins\n",[15,153,154],{},"Keyword arguments are self-documenting and immune to argument-order mistakes, so prefer them\nfor anything non-obvious (especially booleans and numbers).",[10,156,158],{"id":157},"default-argument-values","Default argument values",[15,160,161,162,165],{},"A parameter with a default becomes optional. Defaults must come ",[19,163,164],{},"after"," all\nnon-default parameters:",[35,167,169],{"className":37,"code":168,"language":39,"meta":40,"style":40},"def connect(host, port=5432, timeout=30):\n    ...\n\nconnect(\"db.example.com\")             # uses both defaults\nconnect(\"db.example.com\", timeout=5)  # override just one by name\n",[42,170,171,197,202,206,220],{"__ignoreMap":40},[45,172,173,175,178,181,183,186,189,191,194],{"class":47,"line":48},[45,174,52],{"class":51},[45,176,177],{"class":55}," connect",[45,179,180],{"class":59},"(host, port",[45,182,135],{"class":51},[45,184,185],{"class":76},"5432",[45,187,188],{"class":59},", timeout",[45,190,135],{"class":51},[45,192,193],{"class":76},"30",[45,195,196],{"class":59},"):\n",[45,198,199],{"class":47,"line":63},[45,200,201],{"class":76},"    ...\n",[45,203,204],{"class":47,"line":99},[45,205,103],{"emptyLinePlaceholder":102},[45,207,208,211,214,217],{"class":47,"line":106},[45,209,210],{"class":59},"connect(",[45,212,213],{"class":72},"\"db.example.com\"",[45,215,216],{"class":59},")             ",[45,218,219],{"class":123},"# uses both defaults\n",[45,221,222,224,226,228,231,233,236,239],{"class":47,"line":127},[45,223,210],{"class":59},[45,225,213],{"class":72},[45,227,86],{"class":59},[45,229,230],{"class":132},"timeout",[45,232,135],{"class":51},[45,234,235],{"class":76},"5",[45,237,238],{"class":59},")  ",[45,240,241],{"class":123},"# override just one by name\n",[10,243,245],{"id":244},"the-mutable-default-argument-trap","The mutable default argument trap",[15,247,248,249,252,253,256,257,260],{},"This is the single most famous Python gotcha. A default value is evaluated ",[19,250,251],{},"once",", when\nthe function is defined — not on each call. A mutable default (like ",[42,254,255],{},"[]",") is therefore\n",[19,258,259],{},"shared across all calls",":",[35,262,264],{"className":37,"code":263,"language":39,"meta":40,"style":40},"def add_item(item, items=[]):     # BUG\n    items.append(item)\n    return items\n\nadd_item(\"a\")    # ['a']\nadd_item(\"b\")    # ['a', 'b']  — the same list persists!\n",[42,265,266,287,292,299,303,317],{"__ignoreMap":40},[45,267,268,270,273,276,278,281,284],{"class":47,"line":48},[45,269,52],{"class":51},[45,271,272],{"class":55}," add_item",[45,274,275],{"class":59},"(item, items",[45,277,135],{"class":51},[45,279,280],{"class":59},"[]):     ",[45,282,283],{"class":123},"# ",[45,285,286],{"class":51},"BUG\n",[45,288,289],{"class":47,"line":63},[45,290,291],{"class":59},"    items.append(item)\n",[45,293,294,296],{"class":47,"line":99},[45,295,66],{"class":51},[45,297,298],{"class":59}," items\n",[45,300,301],{"class":47,"line":106},[45,302,103],{"emptyLinePlaceholder":102},[45,304,305,308,311,314],{"class":47,"line":127},[45,306,307],{"class":59},"add_item(",[45,309,310],{"class":72},"\"a\"",[45,312,313],{"class":59},")    ",[45,315,316],{"class":123},"# ['a']\n",[45,318,320,322,325,327],{"class":47,"line":319},6,[45,321,307],{"class":59},[45,323,324],{"class":72},"\"b\"",[45,326,313],{"class":59},[45,328,329],{"class":123},"# ['a', 'b']  — the same list persists!\n",[15,331,332,333,336],{},"The fix is to default to ",[42,334,335],{},"None"," and create a fresh object inside:",[35,338,340],{"className":37,"code":339,"language":39,"meta":40,"style":40},"def add_item(item, items=None):\n    if items is None:\n        items = []\n    items.append(item)\n    return items\n",[42,341,342,356,373,383,387],{"__ignoreMap":40},[45,343,344,346,348,350,352,354],{"class":47,"line":48},[45,345,52],{"class":51},[45,347,272],{"class":55},[45,349,275],{"class":59},[45,351,135],{"class":51},[45,353,335],{"class":76},[45,355,196],{"class":59},[45,357,358,361,364,367,370],{"class":47,"line":63},[45,359,360],{"class":51},"    if",[45,362,363],{"class":59}," items ",[45,365,366],{"class":51},"is",[45,368,369],{"class":76}," None",[45,371,372],{"class":59},":\n",[45,374,375,378,380],{"class":47,"line":99},[45,376,377],{"class":59},"        items ",[45,379,135],{"class":51},[45,381,382],{"class":59}," []\n",[45,384,385],{"class":47,"line":106},[45,386,291],{"class":59},[45,388,389,391],{"class":47,"line":127},[45,390,66],{"class":51},[45,392,298],{"class":59},[10,394,396],{"id":395},"args-variadic-positional-arguments","*args — variadic positional arguments",[15,398,399,402,403,406],{},[42,400,401],{},"*args"," collects extra positional arguments into a ",[19,404,405],{},"tuple",", letting a function take any\nnumber of them:",[35,408,410],{"className":37,"code":409,"language":39,"meta":40,"style":40},"def total(*nums):\n    return sum(nums)\n\ntotal(1, 2, 3)      # 6 — nums is (1, 2, 3)\ntotal()             # 0 — nums is ()\n",[42,411,412,428,438,442,466],{"__ignoreMap":40},[45,413,414,416,419,422,425],{"class":47,"line":48},[45,415,52],{"class":51},[45,417,418],{"class":55}," total",[45,420,421],{"class":59},"(",[45,423,424],{"class":51},"*",[45,426,427],{"class":59},"nums):\n",[45,429,430,432,435],{"class":47,"line":63},[45,431,66],{"class":51},[45,433,434],{"class":76}," sum",[45,436,437],{"class":59},"(nums)\n",[45,439,440],{"class":47,"line":99},[45,441,103],{"emptyLinePlaceholder":102},[45,443,444,447,450,452,455,457,460,463],{"class":47,"line":106},[45,445,446],{"class":59},"total(",[45,448,449],{"class":76},"1",[45,451,86],{"class":59},[45,453,454],{"class":76},"2",[45,456,86],{"class":59},[45,458,459],{"class":76},"3",[45,461,462],{"class":59},")      ",[45,464,465],{"class":123},"# 6 — nums is (1, 2, 3)\n",[45,467,468,471],{"class":47,"line":127},[45,469,470],{"class":59},"total()             ",[45,472,473],{"class":123},"# 0 — nums is ()\n",[10,475,477],{"id":476},"kwargs-variadic-keyword-arguments","**kwargs — variadic keyword arguments",[15,479,480,483,484,260],{},[42,481,482],{},"**kwargs"," collects extra keyword arguments into a ",[19,485,486],{},"dict",[35,488,490],{"className":37,"code":489,"language":39,"meta":40,"style":40},"def configure(**options):\n    return options\n\nconfigure(debug=True, level=3)   # {'debug': True, 'level': 3}\n",[42,491,492,507,514,518],{"__ignoreMap":40},[45,493,494,496,499,501,504],{"class":47,"line":48},[45,495,52],{"class":51},[45,497,498],{"class":55}," configure",[45,500,421],{"class":59},[45,502,503],{"class":51},"**",[45,505,506],{"class":59},"options):\n",[45,508,509,511],{"class":47,"line":63},[45,510,66],{"class":51},[45,512,513],{"class":59}," options\n",[45,515,516],{"class":47,"line":99},[45,517,103],{"emptyLinePlaceholder":102},[45,519,520,523,526,528,531,533,536,538,540,542],{"class":47,"line":106},[45,521,522],{"class":59},"configure(",[45,524,525],{"class":132},"debug",[45,527,135],{"class":51},[45,529,530],{"class":76},"True",[45,532,86],{"class":59},[45,534,535],{"class":132},"level",[45,537,135],{"class":51},[45,539,459],{"class":76},[45,541,148],{"class":59},[45,543,544],{"class":123},"# {'debug': True, 'level': 3}\n",[15,546,547,548,551,552,556],{},"Together, ",[42,549,550],{},"*args, **kwargs"," capture ",[553,554,555],"em",{},"any"," call — which is exactly why decorator wrappers use\nthem to forward arguments transparently.",[10,558,560],{"id":559},"keyword-only-arguments","Keyword-only arguments",[15,562,563,564,566,567,570],{},"A bare ",[42,565,424],{}," in the signature forces every parameter after it to be passed ",[19,568,569],{},"by keyword",".\nThis prevents confusing positional calls:",[35,572,574],{"className":37,"code":573,"language":39,"meta":40,"style":40},"def create_user(name, *, admin=False, active=True):\n    ...\n\ncreate_user(\"Ada\", admin=True)      # OK\ncreate_user(\"Ada\", True)            # TypeError — admin is keyword-only\n",[42,575,576,605,609,613,634],{"__ignoreMap":40},[45,577,578,580,583,586,588,591,593,596,599,601,603],{"class":47,"line":48},[45,579,52],{"class":51},[45,581,582],{"class":55}," create_user",[45,584,585],{"class":59},"(name, ",[45,587,424],{"class":51},[45,589,590],{"class":59},", admin",[45,592,135],{"class":51},[45,594,595],{"class":76},"False",[45,597,598],{"class":59},", active",[45,600,135],{"class":51},[45,602,530],{"class":76},[45,604,196],{"class":59},[45,606,607],{"class":47,"line":63},[45,608,201],{"class":76},[45,610,611],{"class":47,"line":99},[45,612,103],{"emptyLinePlaceholder":102},[45,614,615,618,620,622,625,627,629,631],{"class":47,"line":106},[45,616,617],{"class":59},"create_user(",[45,619,112],{"class":72},[45,621,86],{"class":59},[45,623,624],{"class":132},"admin",[45,626,135],{"class":51},[45,628,530],{"class":76},[45,630,462],{"class":59},[45,632,633],{"class":123},"# OK\n",[45,635,636,638,640,642,644,647],{"class":47,"line":127},[45,637,617],{"class":59},[45,639,112],{"class":72},[45,641,86],{"class":59},[45,643,530],{"class":76},[45,645,646],{"class":59},")            ",[45,648,649],{"class":123},"# TypeError — admin is keyword-only\n",[10,651,653],{"id":652},"positional-only-arguments","Positional-only arguments",[15,655,656,657,660,661,664],{},"A ",[42,658,659],{},"\u002F"," in the signature (3.8+) forces parameters before it to be passed ",[19,662,663],{},"by position"," —\nuseful for parameters whose names are implementation details:",[35,666,668],{"className":37,"code":667,"language":39,"meta":40,"style":40},"def divide(a, b, \u002F):\n    return a \u002F b\n\ndivide(10, 2)        # OK\ndivide(a=10, b=2)    # TypeError — a and b are positional-only\n",[42,669,670,684,696,700,717],{"__ignoreMap":40},[45,671,672,674,677,680,682],{"class":47,"line":48},[45,673,52],{"class":51},[45,675,676],{"class":55}," divide",[45,678,679],{"class":59},"(a, b, ",[45,681,659],{"class":51},[45,683,196],{"class":59},[45,685,686,688,691,693],{"class":47,"line":63},[45,687,66],{"class":51},[45,689,690],{"class":59}," a ",[45,692,659],{"class":51},[45,694,695],{"class":59}," b\n",[45,697,698],{"class":47,"line":99},[45,699,103],{"emptyLinePlaceholder":102},[45,701,702,705,708,710,712,715],{"class":47,"line":106},[45,703,704],{"class":59},"divide(",[45,706,707],{"class":76},"10",[45,709,86],{"class":59},[45,711,454],{"class":76},[45,713,714],{"class":59},")        ",[45,716,633],{"class":123},[45,718,719,721,724,726,728,730,733,735,737,739],{"class":47,"line":127},[45,720,704],{"class":59},[45,722,723],{"class":132},"a",[45,725,135],{"class":51},[45,727,707],{"class":76},[45,729,86],{"class":59},[45,731,732],{"class":132},"b",[45,734,135],{"class":51},[45,736,454],{"class":76},[45,738,313],{"class":59},[45,740,741],{"class":123},"# TypeError — a and b are positional-only\n",[10,743,745],{"id":744},"the-full-parameter-order","The full parameter order",[15,747,748],{},"Putting it all together, a complete signature reads in this fixed order:",[35,750,752],{"className":37,"code":751,"language":39,"meta":40,"style":40},"def f(pos_only, \u002F, normal, *args, kw_only, **kwargs):\n    ...\n# positional-only | normal | *args | keyword-only | **kwargs\n",[42,753,754,778,782],{"__ignoreMap":40},[45,755,756,758,760,763,765,768,770,773,775],{"class":47,"line":48},[45,757,52],{"class":51},[45,759,69],{"class":55},[45,761,762],{"class":59},"(pos_only, ",[45,764,659],{"class":51},[45,766,767],{"class":59},", normal, ",[45,769,424],{"class":51},[45,771,772],{"class":59},"args, kw_only, ",[45,774,503],{"class":51},[45,776,777],{"class":59},"kwargs):\n",[45,779,780],{"class":47,"line":63},[45,781,201],{"class":76},[45,783,784],{"class":47,"line":99},[45,785,786],{"class":123},"# positional-only | normal | *args | keyword-only | **kwargs\n",[15,788,789],{},"You rarely use all five at once, but knowing the order resolves any \"where does this go?\"\nquestion.",[10,791,793],{"id":792},"recap","Recap",[15,795,796,797,800,801,804,805,808,809,811,812,814,815,817,818,820,821,824,825,827,828,831,832,834,835,837],{},"Arguments can be ",[19,798,799],{},"positional"," or ",[19,802,803],{},"keyword","; defaults come last and are evaluated ",[19,806,807],{},"once\nat definition"," — so never use a mutable default, use ",[42,810,335],{}," and create the object inside.\n",[42,813,401],{}," gathers extra positionals into a tuple, ",[42,816,482],{}," gathers extra keywords into a\ndict, and together they forward any call. A bare ",[42,819,424],{}," makes the following parameters\n",[19,822,823],{},"keyword-only",", a ",[42,826,659],{}," makes the preceding ones ",[19,829,830],{},"positional-only",", and the full order is\npositional-only → normal → ",[42,833,401],{}," → keyword-only → ",[42,836,482],{},".",[839,840,841],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":40,"searchDepth":63,"depth":63,"links":843},[844,845,846,847,848,849,850,851,852,853],{"id":12,"depth":63,"text":13},{"id":29,"depth":63,"text":30},{"id":157,"depth":63,"text":158},{"id":244,"depth":63,"text":245},{"id":395,"depth":63,"text":396},{"id":476,"depth":63,"text":477},{"id":559,"depth":63,"text":560},{"id":652,"depth":63,"text":653},{"id":744,"depth":63,"text":745},{"id":792,"depth":63,"text":793},"How Python function arguments work — positional vs keyword, *args and **kwargs, default values and the mutable-default trap, keyword-only and positional-only parameters, and the correct parameter order.","medium","md","Python",{},"\u002Fblog\u002Fpython-function-arguments-args-kwargs-explained","\u002Fpython\u002Ffunctions\u002Farguments",{"title":5,"description":854},"blog\u002Fpython-function-arguments-args-kwargs-explained","Function Arguments","Functions","functions","2026-06-19","t_RI54NVBZXk67eLZjFFKdOyq76E4pFj0HFhz9ThjTU",1782244092853]