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: TeacherMisturando 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 argumentosSaí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: EngineerDesempacotamento 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árioSaída:
debug = True
verbose = False
timeout = 30Pontos Principais:
**kwargscoleta 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
Desafio
FácilNeste 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árioAcesse 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
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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário