A sobrecarga de funções pode não estar incorporada ao Python, mas existem maneiras de imitá-la.

A sobrecarga de funções é um recurso em algumas linguagens de programação que permite definir variações da mesma função. Cada variante tem o mesmo nome, mas implementações diferentes, com assinaturas de função exclusivas.

Esta técnica permite realizar diferentes operações com base no tipo e número de argumentos passados ​​para uma função.

Ao contrário de linguagens como C++ e Java, Python não suporta sobrecarga de funções por padrão, mas existem maneiras de obter funcionalidade semelhante.

Como o Python lida com a sobrecarga de funções?

Em Python, você pode definir a mesma função mais de uma vez com diferentes parâmetros, tipos de dados ou ambos em cada definição. No entanto, o Python reconhecerá apenas a última definição da função quando você a chamar. Aqui está um exemplo:

defarithmetics(a, b):
return a - b

defarithmetics(a, b, c, d):
return a + b - c * d

print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error

instagram viewer

Linguagens orientadas a objetos, como Java, geralmente suportam sobrecarga de funções e métodos. Um método é simplesmente uma função que você define dentro de uma classe.

No código acima, Python reconhecerá apenas a segunda definição do aritmética() função quando você tenta chamá-lo em seu projeto. Se você tentar chamar a função com dois argumentos conforme definidos inicialmente, você receberá um erro que diz "faltando argumentos posicionais necessários".

Você não receberá um erro ao chamar a função com quatro argumentos. Isso significa que o Python substituiu a função pela sua instância mais recente. Este não é o comportamento de sobrecarga, então você precisa lidar com isso.

Portanto, o Python não lida com a sobrecarga de funções por padrão, mas existem alguns truques que você pode usar para simular seu comportamento em seus programas.

Método 1: usando parâmetros opcionais ou argumentos padrão

Você pode obter sobrecarga definindo uma função com argumentos padrão. Aqui está um exemplo:

defarithmetics(a, b=0, c=0):

Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).

return a - b + c

Esta função possui três parâmetros, mas dois deles possuem valores padrão. Isso significa que você pode chamá-lo com um a três argumentos:

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11

Embora essa abordagem permita chamar a função de diversas maneiras diferentes, ela não é muito eficaz no longo prazo. Aqui estão algumas de suas limitações:

  • Você só pode passar argumentos que sejam inteiros ou flutuantes.
  • Não há mudança significativa no comportamento da função. Por exemplo, você não pode alterar seu comportamento para calcular a área de uma forma ou mesmo imprimir Olá Mundo.

Método 2: usando argumentos variáveis

Para usar argumentos variáveis ​​para sobrecarga de funções em Python, você deve inclua o parâmetro args ao definir sua função. O argumentos parâmetro permite que você passe vários argumentos posicionais ao chamar sua função. Aqui está um exemplo:

defarithmetics(a, *args):

Arguments:
a: The first number.
*args: A variable number of arguments (optional).

args_sum = 0

for num in args:
args_sum *= num

return a - args_sum

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10

A função acima recebe dois argumentos: um argumento obrigatório chamado a e a argumentos argumento, que permite inserir quantos argumentos você precisar.

Embora possa receber vários argumentos, a função acima só pode realizar a operação de multiplicação nos argumentos variáveis, ou seja, os argumentos representados pelo argumentos palavra-chave.

Se você quiser realizar múltiplas operações, você deve introduza instruções condicionais em seu código, e isso pode ficar complicado rapidamente.

Método 3: usando o decorador de despacho múltiplo

O decorador de despacho múltiplo é uma biblioteca Python que permite definir múltiplas implementações ou instâncias de uma única função, com base no tipo de seus argumentos. Isso significa que você pode definir a mesma função com diferentes tipos de dados e alterar totalmente seu comportamento.

Para usar o decorador de despacho múltiplo, siga estas etapas:

  1. Instalar múltiplos caminhos em seu ambiente Python:
    pip install multipledispatch
  2. Decore sua(s) função(ões) com o @Despacho decorador. O @Despacho decorador é um Decorador Python que permite implementar vários despachos. Ele despachará automaticamente a função apropriada com base nos argumentos que você passar para ela. Você pode usar o @Despacho decorador seguindo este padrão:
    from multipledispatch import dispatch

    @dispatch(data type1, data type2, data typeX)
    defyour_function(a, b, c, x):
    pass
    # perform your operations here

Aqui está um exemplo que usa o decorador de despacho múltiplo para sobrecarga de funções em Python:

from multipledispatch import dispatch

@dispatch(int, int)
defadd(a, b):

Arguments:
a: Any integer.
b: Any integer.

return a + b

@dispatch(int, list)
defadd(a, b):

Arguments:
a: Any integer.
b: Any Python list.

b.append(a)
return b

# returns 3
print(add(1, 2))

# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))

O trecho de código acima define duas instâncias do adicionar() função. A primeira instância recebe dois inteiros como argumentos e retorna sua soma.

Enquanto isso, a segunda versão desta função recebe um número inteiro e uma lista. Ele anexa o número inteiro à lista e retorna a nova lista.

Essa abordagem para sobrecarga de funções em Python oferece muita flexibilidade, especialmente se você precisar alterar o comportamento do seu método. Você pode aprender mais com o documentação de expedição múltipla.

A melhor abordagem para sobrecarga de funções em Python

A abordagem adotada para a sobrecarga de funções deve depender do que você está tentando alcançar. Se você puder concluir sua tarefa usando argumentos padrão ou variáveis, o decorador de despacho múltiplo poderá ser um exagero. Porém, o decorador de despacho múltiplo costuma ser a melhor opção por sua eficiência e precisão.

Este decorador fornece uma maneira limpa e flexível de implementar sobrecarga de funções em Python. Permite definir múltiplas implementações de uma única função com base no tipo de seus argumentos.

Com essa abordagem, você pode criar funções flexíveis que aceitam diferentes tipos de parâmetros sem a necessidade de instruções condicionais complexas.