{"id":1064,"date":"2026-08-27T08:00:00","date_gmt":"2026-08-27T11:00:00","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=1064"},"modified":"2026-08-13T14:26:51","modified_gmt":"2026-08-13T17:26:51","slug":"como-ia-muda-desenvolvimento-python-dia-a-dia","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/como-ia-muda-desenvolvimento-python-dia-a-dia\/","title":{"rendered":"Como a IA Muda o Desenvolvimento em Python no Dia a Dia"},"content":{"rendered":"<p>Imagine a seguinte cena. Voc\u00ea abre um projeto Python que n\u00e3o toca h\u00e1 tr\u00eas meses. O <code>requirements.txt<\/code> est\u00e1 desatualizado, h\u00e1 tr\u00eas fun\u00e7\u00f5es sem tipagem alguma, um decorator misterioso que ningu\u00e9m sabe explicar e um teste que falha intermitentemente sem motivo aparente. Voc\u00ea gasta a primeira hora do dia apenas reconstruindo o contexto mental que tinha quando escreveu aquele c\u00f3digo. Essa hora, multiplicada por semanas de trabalho, \u00e9 o verdadeiro custo oculto do desenvolvimento em Python: n\u00e3o \u00e9 a linguagem que \u00e9 lenta, \u00e9 a reconstru\u00e7\u00e3o constante de contexto que consome o tempo.<\/p>\n<p>Python sempre foi elogiado pela legibilidade e pela produtividade que oferece logo de in\u00edcio. Mas conforme os projetos crescem \u2014 m\u00faltiplos m\u00f3dulos, depend\u00eancias, ambientes virtuais, testes, tipagem opcional que \u00e0s vezes \u00e9 usada e \u00e0s vezes n\u00e3o \u2014 a complexidade acumulada come\u00e7a a pesar. A promessa de &#8220;c\u00f3digo simples e direto&#8221; se choca com a realidade de bases de c\u00f3digo que ningu\u00e9m mais entende por completo. Neste artigo, vou detalhar como a IA est\u00e1 mudando, de forma concreta e mensur\u00e1vel, o dia a dia de quem programa em Python: da escrita de tipos \u00e0 gest\u00e3o de depend\u00eancias, da gera\u00e7\u00e3o de scripts utilit\u00e1rios \u00e0 revis\u00e3o de c\u00f3digo antes do commit.<\/p>\n<h2>O ponto de partida: por que Python se beneficia tanto da IA<\/h2>\n<p>Python \u00e9 uma linguagem dinamicamente tipada por padr\u00e3o, o que significa que grande parte dos erros que em outras linguagens seriam capturados em tempo de compila\u00e7\u00e3o, em Python s\u00f3 aparecem em tempo de execu\u00e7\u00e3o \u2014 ou nunca, se o teste certo n\u00e3o for escrito. Isso torna o Python extremamente produtivo para prototipagem, mas tamb\u00e9m mais vulner\u00e1vel a bugs sutis em produ\u00e7\u00e3o.<\/p>\n<p>A IA generativa entra exatamente nesse ponto de tens\u00e3o. Ferramentas como <a href=\"https:\/\/claude.ai\/code\" target=\"_blank\">Claude Code<\/a>, <a href=\"https:\/\/cursor.sh\" target=\"_blank\">Cursor<\/a> e o <a href=\"https:\/\/github.com\/features\/copilot\" target=\"_blank\">GitHub Copilot<\/a> conseguem inferir tipos, sugerir contratos de fun\u00e7\u00e3o, detectar inconsist\u00eancias entre docstring e implementa\u00e7\u00e3o, e at\u00e9 prever efeitos colaterais que passariam despercebidos numa revis\u00e3o manual r\u00e1pida. N\u00e3o se trata de a IA &#8220;escrever Python melhor que voc\u00ea&#8221; \u2014 trata-se de a IA compensar exatamente as fragilidades estruturais que a tipagem din\u00e2mica introduz.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> a documenta\u00e7\u00e3o oficial da tipagem em Python, o <a href=\"https:\/\/peps.python.org\/pep-0484\/\" target=\"_blank\">PEP 484<\/a>, formalizou o uso de type hints em 2014. \u00c9 um bom ponto de partida para entender por que ferramentas de IA se apoiam tanto nesse recurso para gerar sugest\u00f5es mais precisas.<\/p><\/blockquote>\n<h2>1. Tipagem assistida: da anota\u00e7\u00e3o manual \u00e0 infer\u00eancia contextual<\/h2>\n<p>Um dos usos mais imediatos e subestimados da IA em Python \u00e9 a gera\u00e7\u00e3o de type hints em c\u00f3digo legado. Considere uma fun\u00e7\u00e3o sem tipagem:<\/p>\n<pre><code>def calcular_desconto(valor, percentual, cliente):\n    if cliente.vip:\n        percentual += 5\n    return valor - (valor * percentual \/ 100)\n<\/code><\/pre>\n<p>Pedir a uma IA para &#8220;adicionar type hints considerando o contexto do m\u00f3dulo&#8221; costuma gerar algo assim:<\/p>\n<pre><code>from decimal import Decimal\n\ndef calcular_desconto(\n    valor: Decimal,\n    percentual: float,\n    cliente: \"Cliente\"\n) -&gt; Decimal:\n    if cliente.vip:\n        percentual += 5\n    return valor - (valor * percentual \/ 100)\n<\/code><\/pre>\n<p>O ganho aqui n\u00e3o \u00e9 apenas est\u00e9tico. Ao inferir que <code>valor<\/code> provavelmente deveria ser <code>Decimal<\/code> \u2014 e n\u00e3o <code>float<\/code>, evitando problemas cl\u00e1ssicos de precis\u00e3o em c\u00e1lculos monet\u00e1rios \u2014 a IA est\u00e1 aplicando um racioc\u00ednio de dom\u00ednio, n\u00e3o apenas sint\u00e1tico. Isso \u00e9 poss\u00edvel porque modelos como os que sustentam o <a href=\"https:\/\/claude.ai\" target=\"_blank\">Claude<\/a> foram treinados com enorme volume de c\u00f3digo real, incluindo os erros e corre\u00e7\u00f5es que a comunidade Python j\u00e1 discutiu extensivamente em f\u00f3runs e reposit\u00f3rios p\u00fablicos.<\/p>\n<h3>Validando a tipagem com ferramentas est\u00e1ticas<\/h3>\n<p>A tipagem sugerida pela IA n\u00e3o deve ser aceita sem verifica\u00e7\u00e3o. \u00c9 aqui que ferramentas como o <a href=\"https:\/\/mypy-lang.org\/\" target=\"_blank\">mypy<\/a> ou o mais recente <a href=\"https:\/\/github.com\/astral-sh\/ty\" target=\"_blank\">ty<\/a>, da Astral (criadora do <a href=\"https:\/\/astral.sh\/ruff\" target=\"_blank\">Ruff<\/a>), entram como camada de checagem:<\/p>\n<pre><code>mypy calcular_desconto.py\n<\/code><\/pre>\n<p>O fluxo ideal \u00e9: IA sugere, ferramenta est\u00e1tica valida, voc\u00ea aprova. Essa tr\u00edade \u2014 sugest\u00e3o, verifica\u00e7\u00e3o automatizada, revis\u00e3o humana \u2014 \u00e9 o padr\u00e3o que est\u00e1 se consolidando em times que usam IA com responsabilidade, em vez de aceitar sugest\u00f5es \u00e0s cegas.<\/p>\n<h2>2. Gera\u00e7\u00e3o de scripts utilit\u00e1rios: o fim do &#8220;Google e Stack Overflow&#8221; para tarefas triviais<\/h2>\n<p>Antes da IA generativa, uma tarefa como &#8220;ler todos os arquivos CSV de uma pasta, consolidar em um \u00fanico DataFrame e exportar como Parquet&#8221; exigia pesquisar sintaxe do Pandas, verificar par\u00e2metros de <code>read_csv<\/code> e testar manualmente. Hoje, esse tipo de script utilit\u00e1rio \u00e9 gerado em segundos, com a vantagem de j\u00e1 vir com tratamento de erros:<\/p>\n<pre><code>import pandas as pd\nfrom pathlib import Path\n\ndef consolidar_csvs(pasta: str, saida: str) -&gt; None:\n    caminho = Path(pasta)\n    arquivos = list(caminho.glob(\"*.csv\"))\n\n    if not arquivos:\n        raise FileNotFoundError(f\"Nenhum CSV encontrado em {pasta}\")\n\n    dataframes = []\n    for arquivo in arquivos:\n        try:\n            df = pd.read_csv(arquivo)\n            df[\"origem\"] = arquivo.name\n            dataframes.append(df)\n        except pd.errors.EmptyDataError:\n            print(f\"Aviso: {arquivo.name} est\u00e1 vazio, ignorando.\")\n\n    resultado = pd.concat(dataframes, ignore_index=True)\n    resultado.to_parquet(saida, index=False)\n    print(f\"Consolidado com sucesso: {len(dataframes)} arquivos em {saida}\")\n\nif __name__ == \"__main__\":\n    consolidar_csvs(\"dados\/\", \"consolidado.parquet\")\n<\/code><\/pre>\n<p>O valor real aqui n\u00e3o est\u00e1 na complexidade do c\u00f3digo \u2014 que \u00e9 modesta \u2014 mas na velocidade com que passa da ideia para uma vers\u00e3o test\u00e1vel. \u00c9 a diferen\u00e7a entre passar vinte minutos revisando documenta\u00e7\u00e3o do <a href=\"https:\/\/pandas.pydata.org\/docs\/\" target=\"_blank\">Pandas<\/a> e passar dois minutos ajustando um c\u00f3digo que j\u00e1 contempla os casos de borda mais comuns.<\/p>\n<h2>3. Gest\u00e3o de depend\u00eancias e ambientes: menos &#8220;funciona na minha m\u00e1quina&#8221;<\/h2>\n<p>Um problema hist\u00f3rico do ecossistema Python \u00e9 a fragmenta\u00e7\u00e3o de ferramentas de ambiente: <code>venv<\/code>, <code>virtualenv<\/code>, <code>pipenv<\/code>, <code>poetry<\/code>, <code>conda<\/code>. A IA ajuda de duas formas concretas nesse ponto.<\/p>\n<h3>Diagn\u00f3stico de conflitos de depend\u00eancia<\/h3>\n<p>Ao colar a sa\u00edda de um erro de instala\u00e7\u00e3o, \u00e9 poss\u00edvel pedir \u00e0 IA que explique a causa raiz. Um erro como:<\/p>\n<pre><code>ERROR: Cannot install package-a==2.1.0 and package-b==1.4.0 because these package versions have conflicting dependencies.\n<\/code><\/pre>\n<p>costuma vir acompanhado de uma explica\u00e7\u00e3o t\u00e9cnica confusa quando lido puro no terminal. Uma IA bem orientada consegue traduzir isso, sugerir vers\u00f5es compat\u00edveis e at\u00e9 propor a migra\u00e7\u00e3o para uma ferramenta mais moderna de resolu\u00e7\u00e3o de depend\u00eancias, como o <a href=\"https:\/\/docs.astral.sh\/uv\/\" target=\"_blank\">uv<\/a>, que resolve grafos de depend\u00eancia de forma significativamente mais r\u00e1pida que o pip tradicional.<\/p>\n<h3>Gera\u00e7\u00e3o de arquivos de configura\u00e7\u00e3o<\/h3>\n<p>Pedir a uma IA para gerar um <code>pyproject.toml<\/code> alinhado \u00e0s pr\u00e1ticas atuais da comunidade \u00e9 outro ganho direto:<\/p>\n<pre><code>[project]\nname = \"meu-projeto\"\nversion = \"0.1.0\"\nrequires-python = \"&gt;=3.11\"\ndependencies = [\n    \"pandas&gt;=2.2\",\n    \"pydantic&gt;=2.7\",\n]\n\n[tool.ruff]\nline-length = 100\ntarget-version = \"py311\"\n\n[tool.mypy]\nstrict = true\n<\/code><\/pre>\n<p>Esse tipo de configura\u00e7\u00e3o, quando escrita manualmente, frequentemente fica defasada em rela\u00e7\u00e3o \u00e0s boas pr\u00e1ticas recomendadas pela comunidade \u2014 porque poucos desenvolvedores acompanham cada mudan\u00e7a das ferramentas. A IA, atualizada com o conhecimento coletivo mais recente incorporado em seu treinamento, tende a sugerir configura\u00e7\u00f5es mais alinhadas ao estado da arte.<\/p>\n<h2>4. Pydantic e valida\u00e7\u00e3o de dados: onde a IA realmente entende o dom\u00ednio<\/h2>\n<p>Um caso de uso particularmente forte da IA em Python \u00e9 a modelagem de dados com <a href=\"https:\/\/docs.pydantic.dev\/\" target=\"_blank\">Pydantic<\/a>, muito usado em APIs constru\u00eddas com <a href=\"https:\/\/fastapi.tiangolo.com\/\" target=\"_blank\">FastAPI<\/a>. Ao descrever em linguagem natural a estrutura de um payload de API, a IA consegue gerar o modelo completo com valida\u00e7\u00f5es:<\/p>\n<pre><code>from pydantic import BaseModel, EmailStr, Field\nfrom datetime import date\n\nclass Cliente(BaseModel):\n    nome: str = Field(min_length=2, max_length=120)\n    email: EmailStr\n    data_nascimento: date\n    saldo_credito: float = Field(ge=0, default=0.0)\n\n    class Config:\n        json_schema_extra = {\n            \"example\": {\n                \"nome\": \"Maria Oliveira\",\n                \"email\": \"maria@exemplo.com\",\n                \"data_nascimento\": \"1990-05-12\",\n                \"saldo_credito\": 150.75\n            }\n        }\n<\/code><\/pre>\n<p>Note que a IA n\u00e3o apenas traduziu campos, mas aplicou restri\u00e7\u00f5es de neg\u00f3cio razo\u00e1veis (idade m\u00ednima impl\u00edcita pelo tipo <code>date<\/code>, saldo n\u00e3o negativo). Esse \u00e9 o tipo de racioc\u00ednio que economiza ciclos de revis\u00e3o em code review, porque muitos desses detalhes de valida\u00e7\u00e3o s\u00e3o exatamente os que passam despercebidos em revis\u00f5es apressadas.<\/p>\n<h2>5. Testes em Python: de &#8220;vou testar depois&#8221; para &#8220;o teste j\u00e1 est\u00e1 pronto&#8221;<\/h2>\n<p>O framework <a href=\"https:\/\/docs.pytest.org\/\" target=\"_blank\">pytest<\/a> \u00e9 o padr\u00e3o de fato em Python, mas escrever testes continua sendo a etapa mais frequentemente postergada em qualquer cronograma. A IA muda esse c\u00e1lculo ao gerar testes junto com a implementa\u00e7\u00e3o, e n\u00e3o depois dela:<\/p>\n<pre><code>import pytest\nfrom decimal import Decimal\nfrom meu_modulo import calcular_desconto\n\nclass ClienteFake:\n    def __init__(self, vip: bool):\n        self.vip = vip\n\ndef test_desconto_cliente_comum():\n    resultado = calcular_desconto(Decimal(\"100\"), 10, ClienteFake(vip=False))\n    assert resultado == Decimal(\"90.0\")\n\ndef test_desconto_cliente_vip():\n    resultado = calcular_desconto(Decimal(\"100\"), 10, ClienteFake(vip=True))\n    assert resultado == Decimal(\"85.0\")\n\ndef test_desconto_zero_por_cento():\n    resultado = calcular_desconto(Decimal(\"50\"), 0, ClienteFake(vip=False))\n    assert resultado == Decimal(\"50.0\")\n<\/code><\/pre>\n<p>O detalhe importante \u00e9 pedir explicitamente casos de borda \u2014 cliente VIP com desconto que ultrapasse 100%, valores negativos, percentuais decimais. A IA cobre bem os casos evidentes; os casos de borda mais sutis do seu dom\u00ednio de neg\u00f3cio continuam sendo responsabilidade da revis\u00e3o humana.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> o livro <em>&#8220;Architecture Patterns with Python&#8221;<\/em>, de Harry Percival e Bob Gregory, dispon\u00edvel gratuitamente em <a href=\"https:\/\/www.cosmicpython.com\/\" target=\"_blank\">cosmicpython.com<\/a>, \u00e9 uma refer\u00eancia s\u00f3lida para quem quer estruturar projetos Python de forma test\u00e1vel \u2014 um complemento essencial para tirar o m\u00e1ximo proveito da gera\u00e7\u00e3o de testes por IA.<\/p><\/blockquote>\n<h2>6. Revis\u00e3o de c\u00f3digo antes do commit: um segundo par de olhos sempre dispon\u00edvel<\/h2>\n<p>Times de desenvolvimento Python frequentemente adotam hooks de pre-commit com <a href=\"https:\/\/pre-commit.com\/\" target=\"_blank\">pre-commit<\/a>, combinando Ruff, mypy e testes r\u00e1pidos. A IA se encaixa nesse fluxo como uma camada adicional de revis\u00e3o sem\u00e2ntica, n\u00e3o apenas sint\u00e1tica. Um exemplo de configura\u00e7\u00e3o:<\/p>\n<pre><code># .pre-commit-config.yaml\nrepos:\n  - repo: https:\/\/github.com\/astral-sh\/ruff-pre-commit\n    rev: v0.6.9\n    hooks:\n      - id: ruff\n        args: [--fix]\n      - id: ruff-format\n<\/code><\/pre>\n<p>Ferramentas de linha de comando com IA, como o <a href=\"https:\/\/docs.anthropic.com\/en\/docs\/claude-code\" target=\"_blank\">Claude Code<\/a>, podem ser incorporadas ao fluxo de revis\u00e3o para analisar o diff antes do push, apontando n\u00e3o apenas problemas de estilo \u2014 que o Ruff j\u00e1 resolve \u2014 mas quest\u00f5es de design: acoplamento excessivo, fun\u00e7\u00f5es que fazem mais de uma coisa, nomes que n\u00e3o refletem a inten\u00e7\u00e3o real do c\u00f3digo.<\/p>\n<h2>7. Onde a IA ainda falha em Python \u2014 e por que isso importa<\/h2>\n<p>\u00c9 importante ser honesto sobre os limites. A IA generativa tende a alucinar nomes de m\u00e9todos em bibliotecas menos populares ou com versionamento inst\u00e1vel \u2014 um problema recorrente com pacotes que mudam a API com frequ\u00eancia entre vers\u00f5es menores. Al\u00e9m disso, sugest\u00f5es de performance nem sempre consideram o contexto real de uso: uma solu\u00e7\u00e3o com <code>list comprehension<\/code> pode ser sugerida onde um generator seria mais adequado para economia de mem\u00f3ria, especialmente ao lidar com grandes volumes de dados.<\/p>\n<p>O ponto central \u00e9 que a IA em Python funciona melhor como acelerador de decis\u00f5es que voc\u00ea j\u00e1 sabe tomar, n\u00e3o como substituto do julgamento t\u00e9cnico. Ela reduz o tempo entre &#8220;eu sei o que precisa ser feito&#8221; e &#8220;est\u00e1 feito e testado&#8221; \u2014 mas n\u00e3o substitui o conhecimento de que algo precisa ser feito de determinada forma.<\/p>\n<h2>Participe da Comunidade Dev&#8217;s AI<\/h2>\n<p>Se voc\u00ea quer discutir esses fluxos com outros desenvolvedores Python que j\u00e1 aplicam IA no dia a dia \u2014 desde gera\u00e7\u00e3o de tipos at\u00e9 arquitetura de testes \u2014 venha para a <a href=\"https:\/\/adrianosantos.link\/ComunidadeDevAI\" target=\"_blank\">Comunidade Dev&#8217;s AI<\/a>. \u00c9 um espa\u00e7o para compartilhar prompts que funcionam, configura\u00e7\u00f5es de ferramentas e casos reais de uso, sem o exagero de marketing que costuma acompanhar o tema.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>A IA n\u00e3o torna o Python uma linguagem diferente. Ela ataca exatamente os pontos onde a flexibilidade da linguagem historicamente cobrava um pre\u00e7o: tipagem opcional negligenciada, testes postergados, configura\u00e7\u00f5es de ambiente desatualizadas, scripts utilit\u00e1rios reescritos do zero a cada necessidade. O ganho real n\u00e3o est\u00e1 em escrever c\u00f3digo mais r\u00e1pido de forma gen\u00e9rica, mas em reduzir o atrito nas tarefas que, apesar de repetitivas, exigem contexto e aten\u00e7\u00e3o \u2014 exatamente onde a IA, bem orientada e sempre revisada, entrega o maior retorno pr\u00e1tico.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagine a seguinte cena. Voc\u00ea abre um projeto Python que n\u00e3o toca h\u00e1 tr\u00eas meses. O requirements.txt est\u00e1 desatualizado, h\u00e1 tr\u00eas fun\u00e7\u00f5es sem tipagem alguma, um decorator misterioso que ningu\u00e9m sabe explicar e um teste que falha intermitentemente sem motivo aparente. Voc\u00ea gasta a primeira hora do dia apenas reconstruindo o contexto mental que tinha [&hellip;]<\/p>\n","protected":false},"author":127,"featured_media":1065,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1064","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/127"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1064"}],"version-history":[{"count":1,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1064\/revisions"}],"predecessor-version":[{"id":1066,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1064\/revisions\/1066"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/1065"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}