Passar dicionários como argumentos para resolver esse problema; ao meu ver é a melhor forma. Utilizar encapsulamento quando há um número alto ou padrões de dados conhecidos ou repetidos é uma boa prática de programação, isso proporciona um código mais fácil de ler, manutenível e menos propenso à erros, é algo que você aprende ao trabalhar com linguagens com paradigma de OO. Ao citar que passar um dicionário não é uma boa opção, fez você receber esses downvotes.
Obrigado pelo feedback lucieudo. Realmente não tinha pensado por esse lado!
Vale lembrar que, caso não seja possível alterar as funções, ainda dá pra passar um dicionário:
def calcular_imposto(valor_bruto, aliquota, deducoes, dependentes, estado):
# faz algo com os valores...
def calcular_salario_liquido(valor_bruto, aliquota, deducoes, dependentes, estado):
# faz algo com os valores...
# mais trocentas funções com os mesmos parâmetros...
params = { 'valor_bruto': 10, 'aliquota': 20, 'deducoes': 3, 'dependentes': 4, 'estado': 'SP' }
calcular_imposto(**params)
calcular_salario_liquido(**params)
O que faz a "mágica" são os dois asteriscos antes de params
: eles fazem o unpacking do dicionário. No exemplo acima, ele faz com que o parâmetro valor_bruto
receba o valor 10
, aliquota
receba o valor 20
e assim por diante.
Claro que se vc já tiver os valores em variáveis separadas, talvez não compense criar o dicionário. Neste caso eu ia preferir usar uma das soluções acima: a tupla que eu sugeri (caso não possa mudar as funções) ou uma classe (mas aí teria que alterar todas as funções, e dependendo do caso pode valer a pena).
De qualquer forma, esta é uma das possibilidades, mas acho que só seria "melhor" caso o dicionário já estivesse criado (por exemplo, se ele veio de algum lugar que já retorna um JSON com todos os valores).