Menu
Coddy logo textTech

O **kwarg

Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 43 de 64.

**kwargs é uma abreviação para "keyword arguments" (argumentos nomeados). Ele permite que uma função aceite qualquer número de argumentos nomeados (como pares key=value) sem a necessidade de defini-los todos antecipadamente.

Como funciona:

  • *args → coleta argumentos posicionais extras em uma tupla
  • **kwargs → coleta argumentos de palavras-chave 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 de palavra-chave 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 vazios

Se nenhum argumento de palavra-chave 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

Desempacotamento de 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ê pode usar qualquer nome após **
  • Use-o quando desejar assinaturas de função flexíveis
  • Ótimo para lidar com parâmetros opcionais ou definições de configuração
challenge icon

Desafio

Fácil

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

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

Folha de consulta

O parâmetro **kwargs permite que um método aceite qualquer número de argumentos nomeados (keyword arguments), coletando-os em um dicionário:

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")

Combine parâmetros regulares, *args e **kwargs:

class Logger:
    def log(self, level, *messages, **options):
        timestamp = options.get('timestamp', False)
        color = options.get('color', 'default')
        
        if timestamp:
            print("[2024-01-01 12:00:00]", end=" ")
        print(f"[{level}]", end=" ")
        for message in messages:
            print(message, end=" ")

logger = Logger()
logger.log("INFO", "User", "logged", "in", timestamp=True, color="green")

Desempacote dicionários ao chamar métodos usando **:

settings = {"debug": True, "verbose": False, "log_level": "INFO"}
config = Config(**settings)  # Desempacota o dicionário

Acesse valores de **kwargs usando métodos de dicionário:

def get_setting(self, key, default=None):
    return self.settings.get(key, default)

# Itera por todos os kwargs
for key, value in self.settings.items():
    print(f"{key} = {value}")

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:
    # Pessoa criada com propriedades:
    # nome: John
    # idade: 25
    # ocupação: Engineer

elif test_case == "empty_test":
    create_person()
    # Saída:
    # Pessoa criada com propriedades:
    # (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:
    # Pessoa criada com propriedades:
    # nome: Alice
    # idade: 30
    # ocupação: Doctor
    # cidade: New York
    # país: USA
    # hobby: Reading
    # e-mail: alice@example.com

elif test_case == "special_characters":
    create_person(name="Bob", email="bob@example.com", phone="123-456-7890")
    # Saída:
    # Pessoa criada com propriedades:
    # nome: Bob
    # e-mail: bob@example.com
    # telefone: 123-456-7890

elif test_case == "numeric_keys":
    create_person(name="Charlie", age=35, height=175, weight=70)
    # Saída:
    # Pessoa criada com propriedades:
    # nome: Charlie
    # idade: 35
    # altura: 175
    # peso: 70

elif test_case == "boolean_values":
    create_person(name="David", is_student=True, is_employed=False)
    # Saída:
    # Pessoa criada com propriedades:
    # nome: 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:
    # Pessoa criada com propriedades:
    # nome: Eve
    # hobbies: ['Reading', 'Swimming', 'Coding']
    # endereço: {'city': 'Boston', 'state': 'MA', 'zip': '02108'}

elif test_case == "unicode_characters":
    create_person(name="José", city="São Paulo", country="Brasil")
    # Saída:
    # Pessoa criada com propriedades:
    # nome: José
    # cidade: São Paulo
    # país: 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 Object Oriented Programming