Bird
Raised Fist0
Pythonprogramming~20 mins

Variable-length keyword arguments (**kwargs) in Python - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
๐ŸŽ–๏ธ
Keyword Arguments Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
โ“ Predict Output
intermediate
2:00remaining
Output of function using **kwargs with default values

What is the output of this Python code?

Python
def greet(**kwargs):
    name = kwargs.get('name', 'Guest')
    greeting = kwargs.get('greeting', 'Hello')
    return f"{greeting}, {name}!"

print(greet(name='Alice'))
AHello, Alice!
BAlice, Hello!
CHello, Guest!
DTypeError
Attempts:
2 left
๐Ÿ’ก Hint

Look at how kwargs.get() provides default values if the key is missing.

โ“ Predict Output
intermediate
1:30remaining
Counting keys in **kwargs

What will be printed by this code?

Python
def count_keys(**kwargs):
    return len(kwargs)

print(count_keys(a=1, b=2, c=3))
ATypeError
B0
C3
D1
Attempts:
2 left
๐Ÿ’ก Hint

Count how many keyword arguments are passed to the function.

๐Ÿ”ง Debug
advanced
2:00remaining
Identify the error with **kwargs unpacking

What error does this code raise when run?

Python
def show_info(**kwargs):
    print(kwargs['age'])

info = {'name': 'Bob', 'age': 25}
show_info(info)
ATypeError
BKeyError
CSyntaxError
DNo error, prints 25
Attempts:
2 left
๐Ÿ’ก Hint

Check how the dictionary is passed to the function expecting keyword arguments.

๐Ÿš€ Application
advanced
2:30remaining
Which call prints all keyword arguments correctly?

Given this function, which call will print all keyword arguments as expected?

Python
def print_all(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
Aprint_all({'x': 1, 'y': 2})
Bprint_all([('x', 1), ('y', 2)])
Cprint_all(*{'x': 1, 'y': 2})
Dprint_all(x=1, y=2)
Attempts:
2 left
๐Ÿ’ก Hint

Remember how to pass keyword arguments to a function expecting **kwargs.

๐Ÿง  Conceptual
expert
3:00remaining
Behavior of **kwargs with overlapping keys

Consider this code snippet. What will be the output?

Python
def func(a, **kwargs):
    print(a)
    print(kwargs)

func(1, a=2, b=3)
A
2
{'b': 3}
BTypeError
C
1
{'a': 2, 'b': 3}
D
1
{'b': 3}
Attempts:
2 left
๐Ÿ’ก Hint

Think about how Python handles duplicate argument names in function calls.

Practice

(1/5)
1. What does **kwargs allow you to do in a Python function?
easy
A. Pass a variable number of keyword arguments as a dictionary
B. Pass a variable number of positional arguments as a tuple
C. Return multiple values from a function
D. Define a function without any parameters

Solution

  1. Step 1: Understand **kwargs usage

    **kwargs collects extra keyword arguments into a dictionary inside the function.
  2. 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.
  3. Final Answer:

    Pass a variable number of keyword arguments as a dictionary -> Option A
  4. Quick 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
A. def func(*kwargs):
B. def func(**kwargs):
C. def func(**kwargs, *args):
D. def func(kwargs**):

Solution

  1. Step 1: Recall correct syntax for keyword arguments

    The correct syntax to accept variable keyword arguments is **kwargs.
  2. Step 2: Check each option

    def func(*kwargs): uses single star which is for positional args. def func(**kwargs, *args): is invalid syntax because **kwargs must come after any *args. def func(kwargs**): is invalid syntax.
  3. Final Answer:

    def func(**kwargs): -> Option B
  4. Quick 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
A. Error: KeyError
B. Hello, Alice!\nHello, None!
C. Hello, stranger!\nHello, stranger!
D. Hello, Alice!\nHello, stranger!

Solution

  1. 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!".
  2. 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!".
  3. Final Answer:

    Hello, Alice!\nHello, stranger! -> Option D
  4. Quick 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
A. Change **kwargs to *args
B. Remove the print statement
C. Add a default value for 'age' using kwargs.get('age', default)
D. Call show_info with age parameter

Solution

  1. Step 1: Identify the error cause

    The function tries to print kwargs['age'], but the call only passes name='Bob'. This causes a KeyError because 'age' key is missing.
  2. Step 2: Choose the fix

    Using kwargs.get('age', default) safely returns a default value if 'age' is missing, avoiding the error.
  3. Final Answer:

    Add a default value for 'age' using kwargs.get('age', default) -> Option C
  4. Quick 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
A. def build_profile(username, **kwargs): profile = {'username': username} profile.update(kwargs) return profile
B. def build_profile(**kwargs, username): kwargs['username'] = username return kwargs
C. def build_profile(username, **kwargs): profile = kwargs profile['username'] = username return profile
D. def build_profile(username, *args): profile = dict(args) profile['username'] = username return profile

Solution

  1. 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 **kwargs must be last.
  2. Step 2: Check dictionary construction

    def build_profile(username, **kwargs): profile = kwargs profile['username'] = username return profile modifies kwargs directly, 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.
  3. Step 3: Evaluate *args usage

    def build_profile(username, *args): profile = dict(args) profile['username'] = username return profile uses *args which collects positional arguments, not keyword arguments, so it won't work as intended.
  4. Final Answer:

    def build_profile(username, **kwargs): profile = {'username': username} profile.update(kwargs) return profile -> Option A
  5. Quick 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