CodeGym /Cursos /Python SELF PT /Trabalho avançado com parâmetros de funções

Trabalho avançado com parâmetros de funções

Python SELF PT
Nível 14 , Lição 3
Disponível

7.1 Obter todos os argumentos de uma função

Em Python, existem algumas maneiras bem práticas de obter, de dentro de uma função, uma lista de todos os parâmetros passados para ela. Vamos dar uma olhada.

Usando *args

*args permite passar uma quantidade variável de argumentos posicionais (comuns) para uma função. Esses argumentos são empacotados em uma tupla e podem ser manipulados dentro da função.


def print_numbers(*args):
    for arg in args:
        print(arg)
        
print_numbers(1, 2, 3, 4, 5)

Explicação

A função print_numbers aceita uma quantidade arbitrária de argumentos posicionais, empacotados em uma tupla args. Podemos iterar sobre os argumentos dentro da função usando um loop for.

Vantagens

  • Flexibilidade: Permite passar qualquer número de argumentos para a função.
  • Versatilidade: Pode ser usada para funções com número indefinido de parâmetros.

Usando **kwargs

**kwargs permite passar uma quantidade variável de argumentos nomeados para uma função. Esses argumentos são empacotados em um dicionário e podem ser manipulados dentro da função.


def print_person_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
        
print_person_info(name="Alice", age=30, city="New York")

Explicação

A função print_person_info aceita uma quantidade arbitrária de argumentos nomeados, empacotados em um dicionário kwargs. Podemos iterar sobre os argumentos dentro da função usando o método items() do dicionário.

Vantagens

  • Flexibilidade: Permite passar qualquer número de argumentos nomeados para a função.
  • Legibilidade: Argumentos nomeados tornam as chamadas de funções mais legíveis.

7.2 Fixação do tipo de argumentos

Apenas argumentos posicionais

No Python 3.8 e acima, é possível definir funções que aceitam argumentos posicionais que podem ser passados apenas por posição. Isso é feito usando o símbolo / na definição da função.


def greet(name, /, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # Saída: Hello, Alice!
greet("Alice", greeting="Hi")  # Saída: Hi, Alice!
# greet(name="Alice")  # Erro: TypeError

Explicação

A função greet aceita um argumento name, que só pode ser passado por posição. Argumentos antes do / só podem ser passados por posição.

Essa abordagem permite restringir o modo de passagem de argumentos, melhorando a legibilidade e evitando erros.

Apenas argumentos nomeados (Keyword-Only Arguments)

Também é possível definir parâmetros de função que só podem ser passados por nome. Isso é feito usando o símbolo * na definição da função.


def greet(*, name, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet(name="Alice")  # Saída: Hello, Alice!
greet(name="Alice", greeting="Hi")  # Saída: Hi, Alice!
# greet("Alice")  # Erro: TypeError

A função greet aceita um argumento name, que só pode ser passado por nome. Argumentos após * só podem ser passados por nome.

Essa abordagem força a indicação explícita dos nomes dos argumentos, melhorando a legibilidade do código.

Combinando argumentos posicionais e nomeados

Também é possível combinar argumentos posicionais e nomeados para atingir a máxima flexibilidade.


def greet(name, /, *, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # Saída: Hello, Alice!
greet("Alice", greeting="Hi")  # Saída: Hi, Alice!
# greet(name="Alice")  # Erro: TypeError

A função greet aceita um argumento name, que só pode ser passado por posição, e um argumento nomeado greeting, que deve ser passado por nome. O uso de / e * permite combinar argumentos posicionais e nomeados.

Exemplo completo de todas as três situações:


def full_example(a, b, /, c, d, *, e, f):
    print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
        
# Chamada de função com diferentes argumentos
full_example(1, 2, 3, 4, e=5, f=6)  # Todos os argumentos são passados corretamente
# full_example(a=1, b=2, c=3, d=4, e=5, f=6)  # Erro: TypeError

Explicação

  • Apenas argumentos posicionais: a e b devem ser passados somente por posição.
  • Argumentos comuns posicionais ou nomeados: c e d podem ser passados tanto por posição quanto por nome.
  • Apenas argumentos nomeados: e e f devem ser passados somente por nome.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION