Bird
Raised Fist0
Pythonprogramming~10 mins

Variable-length keyword arguments (**kwargs) in Python - Interactive Code Practice

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
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define a function that accepts any number of keyword arguments.

Python
def greet([1]):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
Drag options to blanks, or click blank then click option'
A*args
B*kwargs
Ckwargs
D**kwargs
Attempts:
3 left
๐Ÿ’ก Hint
Common Mistakes
Using *args instead of **kwargs
Forgetting the ** before kwargs
Using kwargs without ** which is just a normal parameter
2fill in blank
medium

Complete the code to call the function with keyword arguments.

Python
def show_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

show_info([1])
Drag options to blanks, or click blank then click option'
A['name', 'Alice', 'age', 30]
B'name', 'Alice', 'age', 30
Cname='Alice', age=30
D(name='Alice', age=30)
Attempts:
3 left
๐Ÿ’ก Hint
Common Mistakes
Passing arguments as a list or tuple
Passing arguments as strings instead of key=value pairs
Using parentheses around arguments incorrectly
3fill in blank
hard

Fix the error in the function definition to correctly accept keyword arguments.

Python
def details([1]):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
Drag options to blanks, or click blank then click option'
A**kwargs
Bkwargs
C*args
D*kwargs
Attempts:
3 left
๐Ÿ’ก Hint
Common Mistakes
Using single asterisk instead of double
Not using any asterisk
Using *args instead of **kwargs
4fill in blank
hard

Fill both blanks to create a dictionary comprehension that filters kwargs with values greater than 10.

Python
filtered = {key: value for key, value in kwargs.items() if value [1] 10 and isinstance(value, [2])}
Drag options to blanks, or click blank then click option'
A>
Bint
Cstr
D<
Attempts:
3 left
๐Ÿ’ก Hint
Common Mistakes
Using less than operator instead of greater than
Checking for string type instead of int
Forgetting to check the type
5fill in blank
hard

Fill all three blanks to create a function that prints keys in uppercase and values if they are strings.

Python
def print_strings([1]):
    for key, value in [2].items():
        if isinstance(value, [3]):
            print(f"{key.upper()}: {value}")
Drag options to blanks, or click blank then click option'
A**kwargs
Bkwargs
Cstr
D*args
Attempts:
3 left
๐Ÿ’ก Hint
Common Mistakes
Using *args instead of **kwargs
Not iterating over kwargs
Checking for wrong type

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