Sometimes you want a function to accept any number of named inputs without knowing them all in advance. **kwargs lets you do that easily.
Variable-length keyword arguments (**kwargs) in Python
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
Python
def function_name(**kwargs): # kwargs is a dictionary of named arguments for key, value in kwargs.items(): print(f"{key} = {value}")
**kwargs collects extra named arguments into a dictionary inside the function.
You can use any name instead of kwargs, but kwargs is the common convention.
Examples
Python
def greet(**kwargs): for name, greeting in kwargs.items(): print(f"{name}: {greeting}") greet(John='Hello', Mary='Hi')
info is a dictionary with keys 'age' and 'city'.Python
def show_info(**info): print(info) show_info(age=30, city='Paris')
**kwargs. Extra named arguments go into kwargs.Python
def example(a, b, **kwargs): print(a, b) print(kwargs) example(1, 2, x=10, y=20)
Sample Program
This program defines a function that prints any pet details given as named arguments.
Python
def describe_pet(**kwargs): print("Pet details:") for key, value in kwargs.items(): print(f"{key}: {value}") describe_pet(name='Buddy', species='Dog', age=5)
Important Notes
You can combine *args and **kwargs in the same function to accept any number of positional and named arguments.
Inside the function, kwargs behaves like a normal dictionary.
Summary
**kwargs lets functions accept any number of named arguments as a dictionary.
Use it when you want flexible, optional named inputs.
Inside the function, access the arguments by their names as dictionary keys.
Practice
1. What does
**kwargs allow you to do in a Python function?easy
Solution
Step 1: Understand
**kwargsusage**kwargscollects extra keyword arguments into a dictionary inside the function.Step 2: Compare with other options
Pass a variable number of positional arguments as a tuple describes*args, not**kwargs. Options A and C are unrelated to**kwargs.Final Answer:
Pass a variable number of keyword arguments as a dictionary -> Option AQuick Check:
**kwargs= keyword args dict [OK]
Hint: Remember: **kwargs collects named arguments as a dict [OK]
Common Mistakes:
- Confusing *args with **kwargs
- Thinking **kwargs collects positional arguments
- Believing **kwargs returns multiple values
2. Which of the following is the correct way to define a function that accepts variable keyword arguments?
easy
Solution
Step 1: Recall correct syntax for keyword arguments
The correct syntax to accept variable keyword arguments is**kwargs.Step 2: Check each option
def func(*kwargs): uses single star which is for positional args. def func(**kwargs, *args): is invalid syntax because**kwargsmust come after any*args. def func(kwargs**): is invalid syntax.Final Answer:
def func(**kwargs): -> Option BQuick Check:
Double star before kwargs means keyword args [OK]
Hint: Use double star ** before kwargs in function definition [OK]
Common Mistakes:
- Using single star * instead of double star **
- Placing **kwargs incorrectly in parameters
- Writing invalid syntax like kwargs**
3. What will be the output of the following code?
def greet(**kwargs):
if 'name' in kwargs:
return f"Hello, {kwargs['name']}!"
else:
return "Hello, stranger!"
print(greet(name='Alice'))
print(greet(age=30))medium
Solution
Step 1: Analyze function behavior with kwargs
The function checks if 'name' is a key in kwargs. If yes, it returns a greeting with that name; otherwise, it returns "Hello, stranger!".Step 2: Evaluate each print statement
First call passes name='Alice', so output is "Hello, Alice!". Second call passes age=30, no 'name' key, so output is "Hello, stranger!".Final Answer:
Hello, Alice!\nHello, stranger! -> Option DQuick Check:
Check key in kwargs dict to decide greeting [OK]
Hint: Check if 'name' key exists in kwargs before using it [OK]
Common Mistakes:
- Assuming missing key returns None instead of else case
- Expecting KeyError without checking key presence
- Confusing positional and keyword arguments
4. Identify the error in the following code and choose the correct fix:
def show_info(**kwargs):
print(kwargs['age'])
show_info(name='Bob')medium
Solution
Step 1: Identify the error cause
The function tries to printkwargs['age'], but the call only passesname='Bob'. This causes a KeyError because 'age' key is missing.Step 2: Choose the fix
Usingkwargs.get('age', default)safely returns a default value if 'age' is missing, avoiding the error.Final Answer:
Add a default value for 'age' using kwargs.get('age', default) -> Option CQuick Check:
Use kwargs.get() to avoid KeyError on missing keys [OK]
Hint: Use kwargs.get('key', default) to avoid missing key errors [OK]
Common Mistakes:
- Not handling missing keys causing KeyError
- Confusing *args and **kwargs
- Ignoring the need to pass required keys
5. You want to write a function
build_profile that accepts a mandatory username and any number of additional keyword arguments describing user info. Which of the following implementations correctly returns a dictionary with all this data?hard
Solution
Step 1: Understand function parameter order
Mandatory parameters must come before**kwargs. def build_profile(**kwargs, username): kwargs['username'] = username return kwargs is invalid syntax because**kwargsmust be last.Step 2: Check dictionary construction
def build_profile(username, **kwargs): profile = kwargs profile['username'] = username return profile modifieskwargsdirectly, which can cause unexpected side effects. def build_profile(username, **kwargs): profile = {'username': username} profile.update(kwargs) return profile creates a new dict with username, then updates with kwargs safely.Step 3: Evaluate *args usage
def build_profile(username, *args): profile = dict(args) profile['username'] = username return profile uses*argswhich collects positional arguments, not keyword arguments, so it won't work as intended.Final Answer:
def build_profile(username, **kwargs): profile = {'username': username} profile.update(kwargs) return profile -> Option AQuick Check:
Use username param first, then update dict with kwargs [OK]
Hint: Put mandatory params before **kwargs and update dict safely [OK]
Common Mistakes:
- Placing **kwargs before mandatory parameters
- Modifying kwargs dict directly
- Using *args instead of **kwargs for keyword data
