Menu
Coddy logo textTech

O **kwarg

Parte da seção Programação Orientada a Objetos do Journey de Python da Coddy. Lição 43 de 64.

**kwargs é uma abreviação de "argumentos nomeados". Ele permite que uma função aceite qualquer número de argumentos nomeados (como pares chave=valor) sem precisar defini-los todos antecipadamente.

Como funciona:

  • *args → coleta argumentos posicionais extras em uma tupla
  • **kwargs → coleta argumentos nomeados extras em um dicionário

Exemplo simples

Vamos começar com o exemplo mais simples possível:

def greet(**kwargs):
    print(kwargs)

greet(name="Alice", age=25, country="Australia")

Saída:

{'name': 'Alice', 'age': 25, 'country': 'Australia'}

Como você pode ver, **kwargs coleta automaticamente todos os argumentos nomeados em um dicionário.

Usando o dicionário

Como kwargs já é um dicionário, você pode percorrê-lo diretamente:

def print_info(**kwargs):
    print("Information received:")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Bob", age=30, job="Teacher")

Saída:

Information received:
name: Bob
age: 30
job: Teacher

Misturando parâmetros regulares com **kwargs

Você pode combinar parâmetros regulares com **kwargs:

def create_profile(name, **details):
    print(f"Creating profile for: {name}")
    print("Additional details:")
    for key, value in details.items():
        print(f"  {key}: {value}")

create_profile("Sarah", age=28, city="London", hobby="Reading")

Saída:

Creating profile for: Sarah
Additional details:
  age: 28
  city: London
  hobby: Reading

**kwargs vazio

Se nenhum argumento nomeado for passado, kwargs será um dicionário vazio:

def show_data(**kwargs):
    if kwargs:
        print("Data:", kwargs)
    else:
        print("No data provided")

show_data()  # Sem argumentos
show_data(item="apple")  # Com argumentos

Saída:

No data provided
Data: {'item': 'apple'}

Exemplo do mundo real: classe com **kwargs

Veja como você pode usar **kwargs em uma classe:

class Person:
    def __init__(self, name, **kwargs):
        self.name = name
        self.details = kwargs
    
    def show_info(self):
        print(f"Name: {self.name}")
        for key, value in self.details.items():
            print(f"{key}: {value}")

person = Person("Alice", age=25, city="New York", job="Engineer")
person.show_info()

Saída:

Name: Alice
age: 25
city: New York
job: Engineer

Desempacotando dicionários

Você também pode desempacotar dicionários ao chamar funções:

def display_settings(**kwargs):
    for setting, value in kwargs.items():
        print(f"{setting} = {value}")

settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings)  # Desempacota o dicionário

Saída:

debug = True
verbose = False
timeout = 30

Pontos principais:

  • **kwargs coleta argumentos nomeados em um dicionário: nenhuma conversão é necessária, ele já é um
  • O nome kwargs é convencional — você poderia usar qualquer nome após **
  • Use-o quando quiser assinaturas de função flexíveis
  • Ótimo para lidar com parâmetros opcionais ou configurações
challenge icon

Desafio

Fácil

Neste desafio, você implementará um sistema de criação de pessoas com uma cobertura abrangente de testes.

Você precisa editar apenas o arquivo person_creator.py, seguindo os comentários TODO que orientam sua implementação. O arquivo contém uma estrutura de classe para criar e gerenciar objetos de pessoa com várias propriedades.

Experimente você mesmo

from person_creator import create_person

# Manipulador abrangente de casos de teste
test_case = input()

if test_case == "basic_test":
    create_person(name="John", age=25, occupation="Engineer")
    # Saída:
    # Person created with properties:
    # name: John
    # age: 25
    # occupation: Engineer

elif test_case == "empty_test":
    create_person()
    # Saída:
    # Person created with properties:
    # (nenhuma saída adicional pois não há propriedades)

elif test_case == "many_properties":
    create_person(name="Alice", age=30, occupation="Doctor", city="New York", 
                 country="USA", hobby="Reading", email="alice@example.com")
    # Saída:
    # Person created with properties:
    # name: Alice
    # age: 30
    # occupation: Doctor
    # city: New York
    # country: USA
    # hobby: Reading
    # email: alice@example.com

elif test_case == "special_characters":
    create_person(name="Bob", email="bob@example.com", phone="123-456-7890")
    # Saída:
    # Person created with properties:
    # name: Bob
    # email: bob@example.com
    # phone: 123-456-7890

elif test_case == "numeric_keys":
    create_person(name="Charlie", age=35, height=175, weight=70)
    # Saída:
    # Person created with properties:
    # name: Charlie
    # age: 35
    # height: 175
    # weight: 70

elif test_case == "boolean_values":
    create_person(name="David", is_student=True, is_employed=False)
    # Saída:
    # Person created with properties:
    # name: David
    # is_student: True
    # is_employed: False

elif test_case == "nested_structures":
    create_person(name="Eve", hobbies=["Reading", "Swimming", "Coding"], 
                 address={"city": "Boston", "state": "MA", "zip": "02108"})
    # Saída:
    # Person created with properties:
    # name: Eve
    # hobbies: ['Reading', 'Swimming', 'Coding']
    # address: {'city': 'Boston', 'state': 'MA', 'zip': '02108'}

elif test_case == "unicode_characters":
    create_person(name="José", city="São Paulo", country="Brasil")
    # Saída:
    # Person created with properties:
    # name: José
    # city: São Paulo
    # country: Brasil
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Python online