Entendendo posição em chamadas de função e argumentos
Vou direto ao ponto porque essa dúvida aparece com frequência em lists de discussão e fóruns técnicos. Quando alguém pergunta se algo é antes ou depois, geralmente está se referindo à ordem dos parâmetros em chamadas de função, ou à forma como argumentos posicionais são resolvidos antes de argumentos nomeados. Eu já perdi tempo demais tentando entender por que um código que funcionava no computador do colega não rodava no meu, só pra descobrir que a ordem dos parâmetros estava trocada entre as duas versões da biblioteca.
O que significa pos é antes ou depois na prática
A resposta curta é: depende de como a função foi definida. A maioria das linguagens modernas resolve argumentos posicionais primeiro, na ordem em que aparecem, e só depois mapeia os argumentos nomeados pelos seus nomes. Isso parece óbvio até você se deparar com uma assinatura de função que não está documentada direito e começa a chute. No Python, por exemplo, a ordem de resolução é a seguinte. Argumentos posicionais preenchem os parâmetros na sequência do cabeçalho da função. Se sobrar algum parâmetro sem valor, o interpretador tenta completar com argumentos nomeados. Isso significa que você pode escrever algo como minha_funcao(10, y=20) e o Python entende perfeitamente, desde que x seja o primeiro parâmetro e y o segundo na definição da função.
O problema aparece quando há variadic positional arguments, o famoso *args. Nesse caso, tudo que vier depois do asterisco é empacotado em uma tupla. E se você tentar passar um argumento nomeado antes dos posicionais variádicos, o interpretador vai reclamar. Eu já passei por isso com uma API de pagamento onde o terceiro parâmetro era *extra e eu insistia em passar campos extras como key=value na posição errada. O workaround foi usar kwargs explicitamente e verificar a documentação da própria biblioteca, porque o erro retornado era genérico demais. Em JavaScript a coisa funciona de maneira diferente. Parâmetros com valor padrão são preenchidos na ordem, e o operador de espalhamento (...) captura o resto dos argumentos posicionais. Se você chamar funcao(1, 2, 3, a=4), o a=4 vira parte de um objeto e não se encaixa em nenhum parâmetro nomeado a menos que a função use destructuring no final. Isso confunde muita gente que vem de Python.
Regras que valem na maioria das linguagens
Na grande maioria das linguagens, a ordem dos argumentos segue um padrão que pode ser resumido assim: Primeiro vêm os parâmetros posicionais obrigatórios, preenchidos da esquerda para a direita. Depois os opcionais com valor default. Em seguida, se existir, o *args ou equivalente recebe os extras. Por último, os kwargs ou argumentos nomeados variádicos completam o restante.
Isso significa que, na dúvida, sempre declare os parâmetros que você mais usa como posicionais e deixe os que são mais raros para o final. É uma convenção quase universal, mas não é regra absoluta. Algumas bibliotecas seguem convenções próprias e você pode se deparar com uma assinatura completamente invertida. Um exemplo concreto. Eu estava integrando um sistema de relatórios onde a função gerar_pdf(caminho, dados, estilo) esperava o caminho como terceiro parâmetro, não como primeiro. Perdi uma manhã inteira debugando até perceber que a biblioteca interna reordenava os argumentos internamente usando um decorator que eu não tinha visto nos imports. A lição foi simples: olhe a assinatura real, não a documentação de terceiros.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Erros comuns que todo mundo comete
O erro mais frequente é assumir que a ordem dos argumentos na chamada deve ser idêntica à ordem na definição. Em linguagens que suportam argumentos nomeados, isso raramente é necessário. Você pode pular parâmetros opcionais e só preencher os que precisa, desde que use o nome correto. O segundo erro clássico é tentar misturar argumentos posicionais e nomeados de forma inconsistente. Após o primeiro argumento nomeado, todos os subsequentes também precisam ser nomeados na maioria das linguagens. Tentar fazer funcao(1, nome="valor", 2) vai gerar erro de sintaxe em Python e em quase todas as outras.
Um terceiro erro que vejo todo dia é negligenciar a diferença entre parâmetro e argumento. Parâmetro é o nome na definição da função. Argumento é o valor que você passa na chamada. Confundir esses termos na hora de ler traceback ou documentação gera mal-entendidos desnecessários. Outro detalhe importante que poucos levam em conta é o comportamento de mutabilidade. Quando um argumento posicional é um objeto mutável e a função modifica esse objeto, a mudança persiste após a chamada. Isso não acontece com valores imutáveis como inteiros e strings. Eu já vi um bug produzido exatamente por isso: um desenvolvedor passava uma lista como parâmetro posicional esperando que a função criasse uma cópia interna, mas a função modificava a lista original. O código rodava normalmente, só que os dados de outro módulo eram corrompidos silenciosamente.
Como verificar a ordem correta numa biblioteca desconhecida
Se você está lidando com uma função de uma biblioteca que não tem documentação clara, a maneira mais direta é inspecionar a assinatura usando ferramentas nativas. Em Python, inspect.signature(funcao) mostra a ordem exata dos parâmetros, incluindo nomes, tipos e valores padrão. Em JavaScript, funcao.length retorna o número de parâmetros nomeados antes do rest parameter, mas não mostra nomes de parâmetros individuais. Outra opção é olhar o código-fonte da função. Muitas vezes a documentação está desatualizada, mas o código mostra a realidade. No caso da biblioteca de relatórios que citei antes, a assinatura real estava em um arquivo core.py que ninguém havia atualizado no ReadTheDocs.
Se nenhuma dessas opções estiver disponível, o que funciona na prática é testar com argumentos de testemunha. Chame a função passando valores fáceis de rastrear, como strings identificadoras, e observe o resultado. Se a função retornar algo como "parametro Recebido: valor_teste", você consegue mapear qual argumento foiado para qual parâmetro. É um método lento, mas infalível.
Resumo prático
pos é antes ou depois depende inteiramente da definição da função que você está chamando. Na ausência de documentação confiável, inspecione a assinatura, leia o código-fonte ou teste com valores de testemunha. Evite assumir ordens baseando-se em outras funções da mesma biblioteca, mesmo que pareçam semelhantes. E sempre considere o efeito colateral de passar objetos mutáveis como argumentos posicionais, porque esse é o erro que mais causa problemas difíceis de rastrear em produção. O tempo que você gasta verificando a ordem correta no início economiza horas de debug depois. Não pule essa etapa, mesmo que pareça óbvia.