<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Pydantic on Blog do Riverfount</title>
    <link>https://riverfount.dev.br/tags/pydantic/</link>
    <description>Recent content in Pydantic on Blog do Riverfount</description>
    <generator>Hugo -- 0.148.2</generator>
    <language>pt-BR</language>
    <lastBuildDate>Fri, 10 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://riverfount.dev.br/tags/pydantic/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>dataclass, NamedTuple, attrs ou pydantic: qual usar de verdade?</title>
      <link>https://riverfount.dev.br/posts/cover-dataclass_namedtuple_attrs_pydantic./</link>
      <pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://riverfount.dev.br/posts/cover-dataclass_namedtuple_attrs_pydantic./</guid>
      <description>&lt;p&gt;Existe um ponto no crescimento de qualquer projeto Python em que os dicionários começam a doer. Não de vez — vai acontecendo aos poucos. Você passa um &lt;code&gt;dict&lt;/code&gt; para uma função, a função passa para outra, e em algum momento ninguém mais sabe ao certo quais chaves estão garantidas, qual é o tipo de cada valor, ou o que acontece se uma chave estiver faltando.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;calcular_desconto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pedido&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# pedido tem &amp;#34;valor&amp;#34;? &amp;#34;valor_bruto&amp;#34;? &amp;#34;subtotal&amp;#34;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# &amp;#34;cliente&amp;#34; é um dict também? tem &amp;#34;nivel&amp;#34;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pedido&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;valor&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_fator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pedido&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cliente&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nivel&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Funciona. Ninguém vai questionar em code review. O problema aparece três meses depois, quando alguém passa um pedido sem a chave &lt;code&gt;&amp;quot;nivel&amp;quot;&lt;/code&gt; — ou quando você tenta debugar e o &lt;code&gt;repr&lt;/code&gt; do dicionário tem quarenta chaves misturadas.&lt;/p&gt;</description>
    </item>
    <item>
      <title>O .env que você não deveria ter commitado</title>
      <link>https://riverfount.dev.br/posts/env_vars_secrets/</link>
      <pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://riverfount.dev.br/posts/env_vars_secrets/</guid>
      <description>&lt;p&gt;Existe uma busca no GitHub que retorna milhares de resultados úteis para um atacante:
&lt;code&gt;filename:.env DB_PASSWORD&lt;/code&gt;. Repositórios públicos com arquivos &lt;code&gt;.env&lt;/code&gt; commitados por
acidente, contendo senhas de banco, chaves de API, segredos JWT — tudo em texto claro,
indexado, pesquisável.&lt;/p&gt;
&lt;p&gt;Não é incompetência. É o resultado natural de uma prática que parece razoável: colocar
credenciais num arquivo, adicionar esse arquivo ao &lt;code&gt;.gitignore&lt;/code&gt;, e confiar que o
&lt;code&gt;.gitignore&lt;/code&gt; vai proteger. Funciona até o dia que não funciona — um &lt;code&gt;git add .&lt;/code&gt; no
momento errado, um novo membro do time que clona o repo e cria o &lt;code&gt;.env&lt;/code&gt; a partir do
&lt;code&gt;.env.example&lt;/code&gt; sem perceber que o exemplo já tem valores reais, ou um editor que cria
arquivos temporários fora do padrão ignorado.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
