Bolhaverso

Reader

pt-br

Leia os posts do bolha.blog.

en-us

Read all posts from our users.

from orixás

Eu faço anotações do que eu vou aprendendo e compartilho aqui, se entendi algo errado manda uma mensagem eletrônica para guto@carvalho.life que eu corrijo aqui ;)

Na umbanda você vai perceber que o pai nosso é diferente daquele de outros cultos religiosos tradicionais, alguns chamam de “Pai nosso da Natureza” e outros de “Pai nosso da Umbanda”.

Após pesquisar não achei um autor tal como temos para o Hino, ao que me parece, essa releitura foi algo passado pelos guias e adotado nos terreiros de forma natural e compartilhada.

Pai Nosso que estais nos céus, nas matas, nos mares e em todos os mundos habitados. Santificado seja o teu nome, pelos teus filhos, pela natureza, pelas águas, pela luz, e pelo ar que respiramos.

Que o teu reino, reino do bem, reino do amor e da fraternidade, nos una a todos e a tudo que criastes em torno da sagrada cruz, aos pés do Divino Salvador e Redentor.

Que a tua vontade nos conduza sempre a vontade firme para sermos virtuosos e úteis aos nossos semelhantes. Dai-nos hoje o pão do corpo, o fruto das matas e a água das fontes para o nosso sustento material e espiritual. Perdoa, se merecermos, as nossas faltas e dá o sublime sentimento do perdão para os que nos ofendam.

Não nos deixeis sucumbir ante a luta, dissabores, ingratidões, tentações dos maus espíritos e ilusões pecaminosas da matéria. Envia nos Pai, um raio da tua divina complacência, luz e misericórdia para os teus filhos pecadores que aqui habitam, pelo bem da humanidade, nossa irmã.

Assim seja e assim será, pois essa é a Vossa vontade, Olorum, Nosso Divino Pai Criador.

Ele geralmente é falado no começo dos trabalhos, mas isso pode variar.

:)

 
Read more...

from orixás

Eu faço anotações do que eu vou aprendendo e compartilho aqui, se entendi algo errado manda uma mensagem eletrônica para guto@carvalho.life que eu corrijo aqui ;)

Apesar de existirem muitos tipos de Umbanda, apesar de cada casa, terreiro, tenda ou templo ter suas orientações e formas particulares de cultuar os Orixás, e de trabalhar com as entidades e guias, um elemento é comum em todas as casas, seu Hino.

O Hino da Umbanda escrito por José Manuel Alves, músico português, é oficial em todas as casas de Umbanda.

Refletiu a luz divina
 com todo seu esplendor
é do reino de Oxalá
 Onde há paz e amor
 Luz que refletiu na terra
 Luz que refletiu no mar
 Luz que veio de Aruanda
 Para tudo iluminar 
 Umbanda é paz e amor
 Um mundo cheio de luz
 É força que nos dá vida
e a grandeza nos conduz.
 Avante filhos de fé,
 Como a nossa lei não há,
 Levando ao mundo inteiro
 A Bandeira de Oxalá ! — Autor: José Manuel Alves

Curiosidades

José Manuel, músico e compositor, veio de Portugal para o Brasil em 1929.

José Manuel foi em um terreiro de Umbanda para tentar curar sua cegueira, cego de nascença, buscava enxergar. Ele ouviu sobre uma nova religião foi atrás do Caboclo Sete Encruzilhadas para ajudá-lo. Durante o atendimento o cabloco disse que não era possível curar uma cegueira de origem cármica, mesmo assim, José se apaixou pela Umbanda e decidiu escrever a música em 1960.

Segundo consta, José Manuel dizia que a Umbanda não era para ser vista com os olhos físicos, era para ser vista olhos da alma.

O Hino foi oficializado pelo Caboclo Sete Encruzilhadas em 1961 no segundo congresso de Umbanda, e novamente em 1976 na primeira Convenção do Conselho Nacional Deliberativo de Umbanda.

José Manuel Alves decidiu que não iria cobrar direitos autorais, só pediu que não alterem a letra e que mantenham seu nome como autor da obra, ele também pediu que coloquem a mão no coração ao cantar o hino. A melodia é de Dalmo da Trindade Reis.

Além do Hino ele escreveu diversos pontos de Umbanda para terreiros e músicas populares para intérpretes da época.

Referências

 
Read more...

from orixás

Eu faço anotações do que eu vou aprendendo e compartilho aqui, se entendi algo errado manda uma mensagem eletrônica para guto@carvalho.life que eu corrijo aqui ;)

Quando você começa a frequentar um terreiro vai ouvir que tal semana tem gira de direita ou esquerda, o que pode ser confuso no início, é muito simples de entender.

Quando falamos em Giras de Direita estamos tratando de entidades que vão irradiar energia (irradiação) pra gente, enquanto na Gira de Esquerda as entidades vão consumir energias (consumação) que não fazem bem pra gente.

Direita e esquerda nada mais são do que polos diferentes, assim como positivo, negativo, ativo, passivo, masculino, feminino, 0 e 1, e são a parte de um todo.

Não tem bem ou mal, certo ou errado, são energias distintas, as quais são trabalhadas em dias específicos em cada terreiro.

Gira de Esquerda

Gira com entidades que atuam absorvendo desequilibrios, vícios, energia negativa e a energia mais densa do consulente.

Eles literalmente descarregam o consulente.

Exu e Pombagira atuam mais perto da crosta terreste, mais próximo do consulente, e são especializados em trabalhar estas energias densas, as quais a linha da direita teria mais dificuldade de trabalhar.

Eles nos ajudam a identificar o que está errado dentro de nós, e nos permitem trabalhar a preguiça, a tristeza, a angústia, a depressão, a ansiedade, dentre outras manifestações, mostrando um lado que normalmente não queremos ver, para que assim então possamos aceitar e para que eles possam nos ajudar.

É uma bonita limpeza energética, se o consulente permitir.

Entidades:

  • Exus
  • Pombagiras
  • Exus Mirins
  • Pombagiras Mirins
  • Malandros
  • Cangaceiros

Gira de Direita

Gira com entidades que atuam irradiando energias salutares e sublimes para ajudar o consulente. As entidades vão trabalhar na linha da fé, do amor, da justiça, da superação, dentre outras manifestões divinas e vão recarregar e reequilibrar o consulente.

Entidades:

  • Caboclos e Cablocas
  • Pretos velhos e Pretas velhas
  • Erês
  • Marinheiros(as) e Marujos(as)
  • Boiadeiros e Boiaderas
  • Baianas e Baianos
  • Povo Ciganos
  • Malandros

Exceções

Existem entidades que podem atuar nas duas linhas ou polos, malandros e ciganos são bons exemplos, dentre outros, é importante saber que existem exceções.

 
Read more...

from orixás

Eu faço anotações do que eu vou aprendendo e compartilho aqui, se entendi algo errado manda uma mensagem eletrônica para guto@carvalho.life que eu corrijo aqui ;)

Ficar descalço no terreiro, especialmente na Umbanda, simboliza humildade, respeito ao solo sagrado e conexão direta com a energia da terra (ancestralidade e orixás).

Esse ato permite o aterramento (descarrego de energias negativas) e a purificação, removendo as sujeiras do mundo exterior antes de entrar no espaço ritualístico, focando na espiritualidade.

Significados e Fundamentos

Conexão e Ancestralidade: O solo do terreiro é considerado sagrado, a casa dos Orixás e guias. Estar descalço facilita a troca de energias, onde o médium se conecta com a força da natureza e dos ancestrais.

Humildade e Igualdade: Representa a remoção das vaidades e distinções materiais. Diante do sagrado, todos estão em pé de igualdade, reconhecendo a própria simplicidade.

Purificação Energética (Aterramento): Os pés agem como condutores que dissipam energias densas ou negativas acumuladas, servindo como um “para-raios” para o solo, essencial durante os trabalhos espirituais.

Respeito: É uma forma de não trazer as impurezas físicas e energéticas da rua (“sujeira do mundo”) para o ambiente de fé.

Tradição: Remete à cultura dos povos originários e negros escravizados, que cultuavam suas crenças em contato direto com a terra.

Embora comum para médiuns em giras, o ato de ficar descalço pode ser facultativo para a assistência em alguns terreiros, mas é altamente recomendado como forma de vivenciar a experiência espiritual.

 
Read more...

from orixás

Eu faço anotações do que eu vou aprendendo e compartilho aqui, se entendi algo errado manda uma mensagem eletrônica para guto@carvalho.life que eu corrijo aqui ;)

Essa anotação eu criei quando comecei a ouvir sobre as sete linhas da umbanda ou sete tronos da umbanda dentro do templo, tenda ou terreiro.

Apenas para fixar o que eu aprendi:

  1. Olurum é o criador de tudo.
  2. Oxalá é o Rei dos Orixás.
  3. Aruanda é o plano e/ou cidade espiritual onde moram os guias e os Orixás.

É importante ressaltar que o terreiro que frequento segue a linha de Rubens Saraceni e as informações abaixo vem de sua codificação.

Voltando as sete linhas ou sete tronos, eu entendi que isso se conecta com o que chamam de essências e manifestações da Coroa Divina.

É na Coroa Divina que se assentam as essências e manifestações divinas.

As setes linhas também são chamadas de Setenário Sagrado.

Existem sete essências que se desdobram em manifestões diversas.

Quando falam de uma essência da Coroa Divina, imagine uma Coroa com sete pontas, onde cada ponta representa uma essência divina.

Entenda os Orixás como jardineiros, cada um cuidando de uma essência em um vasto Jardim, ou seja, cada ponta tem um Orixá responsável.

Essências Divinas

  1. Essência Cristalina
  2. Essência Mineral
  3. Essência Vegetal
  4. Essência Ignea (fogo)
  5. Essência Aérea
  6. Essência Telúrica (terra)
  7. Essência Aquática

Essências e Manifestações

  1. Essência Cristalina > Fé
  2. Essência Mineral > Amor
  3. Essência Vegetal > Conhecimento
  4. Essência Ignea > Justiça
  5. Essência Aérea > Lei
  6. Essência Telúrica > Evolução
  7. Essência Aquática > Vida

Essências e Manifestações com detalhes

  1. Essência Cristalina > Fé, religiosidade, ascenção, confiança
  2. Essência Mineral > Amor, fecundidade, comunhão, concepção
  3. Essência Vegetal > Conhecimento, compreensão, estudo, criatividade
  4. Essência Ignea > Justiça, racionalidade
  5. Essência Aérea > Lei, ordenação, hierarquia
  6. Essência Telúrica > Evolução, razão e forma
  7. Essência Aquática > Vida, geração, fertilidade e maternidade

Essências, Manifestações e Orixás Essenciais

  1. Essência Cristalina > Fé > Oxalá
  2. Essência Mineral > Amor > Oxum
  3. Essência Vegetal > Conhecimento > Oxóssi
  4. Essência Ignea > Justiça > Xangô
  5. Essência Aérea > Lei > Ogum
  6. Essência Telúrica > Evolução > Obaluaê
  7. Essência Aquática > Vida > Iemanjá

Essências, Manifestações, Orixás e Polaridades

  1. Essência Cristalina > Fé > Oxalá (++) Logunan (—)
  2. Essência Mineral > Amor > Oxum (—) Oxumaré (++)
  3. Essência Vegetal > Conhecimento > Oxóssi (–+) Obá (–+)
  4. Essência Ignea > Justiça > Xangô (++) Egunitá
  5. Essência Aérea > Lei > Ogum (++) Iansá (—)
  6. Essência Telúrica > Evolução > Obaluaê (+–) Nanã (–+)
  7. Essência Aquática > Vida > Iemanjá (–+) Omolu (+–)

As polaridades também podem ser referenciadas como energia “ativa” e “passiva”, energia “masculina” e “feminina” ou energia “positiva” e “negativa”.

Se quiser aprofundar no tema, leia o Livro “Sete linhas da Umbanda” de Rubens Saraceni.

Curiosidades

Energias

Os Orixás essenciais ou ancestrais, apesar de terem essências específicas, conseguem trabalhar diferentes energias ou manifestações.

Obaluaê pode trabalhar o amor, enquanto Oxóssi pode trabalhar a Justiça, todos podem atuar em todas as essências, manifestações e elementos divinos.

As vezes estamos cultuando um Orixá, recebendo atendimento de uma falange de entidades ligada a este Orixá, com foco nas qualidades e essências do Orixá, mas isso não significa que os outros não estão próximos ajudando e atuando no mesmo jardim divino.

Polaridades

Algumas interpretações, cursos, materiais, livros sobre as polaridades podem conter diferenças como:

  • O par de polaridade de Xangô ser Egunitá
  • O par de polaridade de Ogum ser Iansã

Isso pode ocorrer nos materiais – em especial – dos filhos formados por Saraceni, que podem ter modificado alguns entendimentos.

Para este texto eu retirei as informações diretamente do livro do Saraceni, Sete Linhas da Umbanda, sexta edição.

Sete linhas Diferentes

As sete linhas vão variar conforme a casa, a linha da umbanda, o autor de livro, então entenda qual linha sua casa segue e se aprofunde no tema.

Referências

  • Livro Sete Linhas da Umbanda, sexta edição, Rubens Saraceni
 
Read more...

from in.versos

Há em ti uma canção

Sem voz ou palavras

Uma canção de melodia terna

Cujas notas fazem vibrar meu coração

E a alma, animada, põe-se a bailar

Mas meus olhos, enamorados, esses se entregam

Entregam-se à doce melancolia de saber que não terão a companhia dos teus para verem o amanhecer

 
Leia mais...

from Riverfount

Saber dar bons nomes é uma das habilidades mais valiosas — e menos ensinadas — na engenharia de software. Em Python, nomes de variáveis e funções bem escolhidos tornam o código legível, reduzem ambiguidade e ajudam a preservar o design ao longo do tempo. Seguindo as diretrizes da PEP 8 e os princípios da Clean Architecture, este artigo mostra como criar nomes expressivos, consistentes e concisos, sem cair na armadilha dos identificadores longos ou genéricos. Você verá exemplos reais, más práticas comuns e um mini refactor que demonstra como nomes claros transformam o código.

1. Nomes são parte do design

Um código pode estar correto e, ainda assim, ser difícil de entender. Na maioria das vezes, o problema está nos nomes. Na Clean Architecture, os nomes devem refletir conceitos de negócio, não detalhes técnicos ou estruturais.

Má prática Boa prática Por quê?
db_user user_account Remove o detalhe técnico e foca no domínio.
json_response order_summary “JSON” é formato, não conceito.
user_data customer_profile “Data” é genérico; “profile” tem significado.

A lógica é simples: nomeie pelo propósito, não pela forma.

2. PEP 8: legibilidade é prioridade

A PEP 8 vai muito além da estética — ela é um guia de comunicação entre pessoas.
Algumas regras práticas:

  • Use snake_case para variáveis e funções.
  • Evite abreviações desnecessárias (cfg, cnt, ttl). Prefira nomes completos (config, count, total).
  • Use plural para coleções (users, orders) e singular para elementos únicos (user, order).
  • Remova redundâncias no contexto: dentro de UserService, prefira get_user() a get_user_data().
# ruim
def list_all_active_user_objects():
    ...

# bom
def list_active_users():
    ...

No segundo exemplo, o nome é simples e direto — o leitor entende a intenção de imediato.

3. Contexto é autoexplicativo

Bons nomes reduzem a necessidade de comentários. O código deve ser quase uma frase legível.

# ruim
data = get_data()

# bom
user_orders = order_service.fetch_recent_orders(user_id)

Outro exemplo comum:

# ruim
flag = True
if flag:
    process()

# bom
should_notify = True
if should_notify:
    send_notification()

Quando as variáveis comunicam intenção, o raciocínio flui naturalmente — o código se torna autoexplicativo.

4. Clareza e concisão

Nomes longos demais são tão ruins quanto nomes curtos e vagos.
O segredo é deixar o contexto carregar parte do significado.

Má prática Boa prática Justificativa
customer_account_balance_after_transaction_update new_balance O contexto já comunica o momento.
temporary_order_price_value temp_price Clareza mantida, sem prolixidade.
is_user_valid_and_authenticated is_authenticated Detalhes extras só atrapalham.

A clareza vem do contexto, não do tamanho do nome.

5. Nomear é projetar

Nomes são uma peça invisível da arquitetura do sistema. Quando todas as partes falam a mesma língua — a do negócio —, o código mantém coesão e resiliência. Trocar o banco ou o framework é fácil; perder clareza semântica, porém, é caro.

Bons nomes preservam a intenção arquitetural — mesmo após refatorações.
Eles são a ponte entre design técnico e linguagem de domínio.

6. Checklist rápido de boas práticas

  1. Use a linguagem do domínio, não da tecnologia.
  2. Seja claro, mas evite redundâncias.
  3. Adapte a granularidade: nomes locais curtos, nomes globais descritivos.
  4. Descreva propósito, não formato técnico.
  5. Evite genéricos (data, info, object).
  6. Mantenha consistência terminológica.
  7. Não exponha infraestrutura (db_, api_, json_) em camadas de domínio.
  8. Reveja nomes em PRs — eles comunicam tanto quanto o código em si.

7. Exemplo prático de refatoração

Um exemplo simples mostra o poder de nomes bem escolhidos.

Antes (difícil de entender):

def p(u, d):
    r = []
    for i in d:
        if i[1] == u:
            r.append(i[0])
    return r

Esse código até funciona, mas o leitor não sabe o que p, u, d ou r significam.

Depois (mesma lógica, nomes expressivos):

def get_orders_by_user(user_id: int, orders: list[tuple[int, int]]) -> list[int]:
    user_orders = []
    for order_id, owner_id in orders:
        if owner_id == user_id:
            user_orders.append(order_id)
    return user_orders

Sem mudar nada na lógica, o código agora se explica. Os nomes contam a história completa — o que está sendo filtrado, por quê e o que é retornado.

Conclusão

Dar bons nomes é mais do que estilo: é comunicação entre mentes técnicas. Variáveis bem nomeadas expressam intenção, reforçam arquitetura e tornam o código sustentável ao longo do tempo. O nome certo transforma a leitura em compreensão imediata — e isso é poder puro na engenharia de software.

Se este artigo te fez repensar como você nomeia variáveis, compartilhe com sua equipe ou continue a conversa no Mastodon: @riverfount@bolha.us

Espalhe boas práticas e ajude mais pessoas a escrever código que realmente se explica por si só.

 
Read more...

from in.versos

Sei que amas as flores com as quais teus tantos amantes te presenteiam. E talvez te entristeças por eu não te enviá-las.

Mas flores, querida, morrem cedo. Já o meu amor por ti jaz eternizado nos versos que te dediquei.

 
Leia mais...

from Riverfount

A complexidade ciclomática mede o número de caminhos de execução independentes em uma função ou módulo Python, ajudando a identificar código difícil de testar e manter. Desenvolvida por Thomas J. McCabe em 1976, essa métrica é calculada como o número de pontos de decisão (if, for, while, etc.) mais um, revelando riscos em fluxos ramificados excessivos.

Mas o que é Complexidade Ciclomática?

Complexidade ciclomática (CC) quantifica a densidade de caminhos lógicos em um grafo de controle de fluxo. Em Python, cada estrutura condicional ou de loop adiciona ramificações: um if simples eleva a CC para 2, enquanto and/or em condições compostas multiplica caminhos independentes. A fórmula básica é CC = E - N + 2P, onde E são arestas, N nós e P componentes conectados, mas ferramentas como radon ou flake8 computam isso automaticamente.

E por que diminuir a CC importa para Pythonistas?

Código Python com CC alta (>10) aumenta o risco de bugs ocultos e eleva o custo de testes unitários para cobertura total. Funções longas com if-elif-else encadeados violam o Zen of Python (“Flat is better than nested”), complicando debugging em IDEs como PyCharm. Em microservices ou APIs Flask/FastAPI, CC elevada impacta deploy em Docker, pois refatorações viram gargalos em CI/CD.

Calculando CC em Código Python

Considere este exemplo problemático:

def processar_usuario(usuario, eh_admin=False, eh_pago=False):
    if not usuario:
        return None
    if eh_admin and eh_pago:
        return "acesso_total"
    elif eh_admin:
        return "acesso_admin"
    elif eh_pago:
        return "acesso_basico"
    else:
        if usuario.ativo:
            return "acesso_limitado"
        return "bloqueado"

Aqui, CC ≈ 6 devido a ramificações múltiplas. Use radon cc arquivo.py para medir:

processar_usuario: CC=6 (alto risco)

Interpretação e Limites Recomendados

Faixa de CC Nível de Risco Ação Sugerida
1-5 Baixo Manter como está
6-10 Moderado Refatorar se possível
11-20 Alto Dividir função imediatamente
>20 Crítico Refatoração urgente

Valores acima de 10 sinalizam antipadrões em Python, como god functions em Django views.

Estratégias de Redução em Python

  • Extraia funções puras: Divida em helpers como validar_usuario() e determinar_nivel_acesso().
  • Use polimorfismo: Substitua condicionais por classes com @dataclass ou Enum.
  • Guard clauses: Prefira if not condicao: return para early returns.
  • Strategy Pattern: Dicionários mapeiam condições a funções: handlers = {eh_admin: handler_admin}.
  • Ferramentas: Integre pylint ou mypy no pre-commit hook Git para alertas automáticos.

Exemplo refatorado (CC reduzida para 2):

def processar_usuario(usuario, eh_admin=False, eh_pago=False):
    if not usuario:
        return None
    return determinar_nivel_acesso(usuario.ativo, eh_admin, eh_pago)

def determinar_nivel_acesso(ativo, eh_admin, eh_pago):
    if eh_admin and eh_pago:
        return "acesso_total"
    handlers = {
        (eh_admin, eh_pago): "acesso_basico",
        eh_admin: "acesso_admin"
    }
    return handlers.get((eh_admin, eh_pago), "acesso_limitado" if ativo else "bloqueado")

Integração em Workflows Python

Em projetos com pytest, mire 100% branch coverage em funções CC<10. No VS Code, extensões como "Python Docstring Generator" ajudam na documentação pós-refatoração. Para equipes, thresholds no GitHub Actions bloqueiam merges com CC>15, alinhando com práticas DevOps em Kubernetes.

Monitore CC regularmente para código limpo e escalável em Python. Experimente radon no seu repo hoje e compartilhe comigo em @riverfount@bolha.us sua maior redução de CC!

 
Read more...

from in.versos

Ah, os doces sabores da vida.

Suaves, cítricos, florais, intensos, agridoces.

Sorrisos, olhares, abraços e lábios.

Lábios que beijam, sussurram e provocam.

Lábios vermelhos, lábios de Mell, Pablyne, sublimes.

Sabores que não precisam ser provados para se saber que são doçura, delícia e prazer.

 
Leia mais...

from Riverfount

Evitar números mágicos em expressões booleanas é uma recomendação explícita de linters Python modernos (como Pylint e Ruff, via regra PLR2004), pois esses valores dificultam a leitura e a manutenção do código. Entender essa regra e o contexto em que ela surgiu ajuda a justificar a prática ao time e a padronizar o estilo da base de código.

PLR2004: de onde vem essa regra?

A sigla PLR2004 é o identificador da regra magic-value-comparison em ferramentas de lint para Python, como o linter Ruff, que reutiliza a numeração herdada do Pylint. A regra é derivada diretamente da mensagem de refatoração R2004 – magic-value-comparison do Pylint, mantido pelo projeto PyCQA, que incentiva o uso de constantes nomeadas em vez de valores mágicos em comparações.

Na documentação do Ruff, a PLR2004 é descrita como uma verificação que detecta o uso de constantes numéricas “mágicas” em comparações, sugerindo substituí-las por variáveis constantes, justamente para melhorar legibilidade e manutenibilidade. A própria descrição enfatiza que o uso de valores mágicos é desencorajado pelas diretrizes de estilo PEP 8.

O que a PLR2004 considera um “magic value”

A regra PLR2004 inspeciona comparações como ==, !=, <, >, <= e >= em busca de literais numéricos sem nome, tratando-os como magic values quando representam algo além de números triviais. A documentação do Ruff destaca que esses valores tornam o código mais difícil de ler, pois o significado precisa ser inferido apenas pelo contexto, e recomenda o uso de constantes nomeadas.

Por conveniência, a regra costuma ignorar alguns valores muito comuns, como 0, 1 e "", que aparecem em operações idiomáticas, mas ainda assim permite configurar uma allowlist de valores aceitáveis para cenários específicos. Essa flexibilidade existe porque, em certos domínios, números como 90, 180 ou 360 deixam de ser “mágicos” e passam a ser parte da linguagem natural do problema (por exemplo, ângulos em graus).

Por que números mágicos atrapalham em expressões booleanas

Em expressões booleanas, o problema dos números mágicos fica mais evidente, porque a condição deveria comunicar a regra de negócio de forma clara. Ao escrever algo como if status == 2:, o leitor não sabe, de imediato, o que 2 representa: ativo, suspenso, cancelado?

A documentação do Pylint para magic-value-comparison / R2004 afirma que usar constantes nomeadas em vez de valores mágicos melhora a legibilidade e a manutenibilidade do código. Quando o valor de negócio muda (por exemplo, o status “ativo” deixa de ser 2 e passa a ser 3), o uso de literais espalhados exige uma busca manual sujeita a erro, enquanto uma constante única permite a mudança em um único ponto.

Exemplos em Python aplicando a PLR2004

Exemplo ruim: números mágicos em comparações

def can_access_admin_area(user_role: int) -> bool:
    # 1 = admin, 2 = editor, 3 = viewer
    return user_role == 1

Nesse caso, a PLR2004 sinalizaria o 1 como um magic value na comparação, sugerindo a extração para uma constante com nome significativo.

Exemplo melhor: constante nomeada

ADMIN_ROLE_ID = 1

def can_access_admin_area(user_role: int) -> bool:
    return user_role == ADMIN_ROLE_ID

Aqui, a expressão booleana se explica sozinha e a ferramenta de lint não acusa a regra PLR2004, pois o valor numérico está encapsulado em uma constante nomeada.[2][1]

Exemplo ruim: múltiplos valores mágicos

def is_valid_retry(status_code: int, retries: int) -> bool:
    # 200: OK; 500: erro interno; 3: máximo de tentativas
    return status_code != 200 and status_code != 500 and retries < 3

Esse padrão é exatamente o tipo de uso que a regra magic-value-comparison (PLR2004) se propõe a detectar.

Exemplo melhor: constantes de domínio

HTTP_OK = 200
HTTP_INTERNAL_ERROR = 500
MAX_RETRIES = 3

def is_valid_retry(status_code: int, retries: int) -> bool:
    return status_code not in (HTTP_OK, HTTP_INTERNAL_ERROR) and retries < MAX_RETRIES

Agora cada número tem um nome de domínio, a intenção da condição é clara e a manutenção futura fica concentrada nas constantes.

Exemplo com Enum para estados

from enum import Enum, auto

class UserStatus(Enum):
    INACTIVE = auto()
    ACTIVE = auto()
    SUSPENDED = auto()

def is_active(status: UserStatus) -> bool:
    return status is UserStatus.ACTIVE

Ao usar Enum, o código evita completamente comparações numéricas, eliminando o gatilho da PLR2004 e expressando a lógica booleana em termos de estados de negócio.

Conclusão: aproveite PLR2004 a seu favor

A regra PLR2004 (magic-value-comparison), definida originalmente no Pylint e incorporada pelo linter Ruff, existe justamente para forçar a substituição de números mágicos por constantes e construções semânticas em comparações. Em vez de encarar o aviso como ruído, é possível usá-lo como guia de refatoração para deixar suas expressões booleanas mais claras, consistentes e fáceis de evoluir.

 
Read more...

from in.versos

Vi, refletida na superfície do espelho, a face oculta da Morte.

Anjo, em vestes negras, cuja efígie me enfeitiça e cujo toque gélido anseio — em encanto e deleite —

no entrecruzar das mãos, cedidas a uma dança.

Uma única valsa, antes do fim.

 
Leia mais...

from in.versos

Era primeiro de abril. Uma noite serena.

Dois desconhecidos entre amigos e cigarros baratos.

Você sorriu! Era primeiro de abril.

E foi a primeira vez em que eu te amei!

 
Leia mais...

from Riverfount

Descubra como o pattern matching no Python 3.10+ transforma árvores de if/elif em código declarativo e poderoso, superando limitações do switch case clássico. Neste guia técnico para desenvolvedores Python, explore exemplos práticos de destructuring de listas, dicionários e classes, guards e padrões compostos – otimizado para buscas como “pattern matching Python tutorial”, “match case vs switch Python” e “structural pattern matching exemplos”.

O que Torna o Pattern Matching Único

Introduzido pelos PEPs 634, 635 e 636 no Python 3.10, o match/case vai além da comparação de valores: descreve a estrutura de dados, desconstruindo tuplas, listas, dicionários e objetos em variáveis prontas para uso. Diferente do switch case de C/Java, que compara apenas escalares sem fallthrough automático, aqui o primeiro case que casa encerra o bloco, eliminando bugs comuns. Ideal para APIs REST, eventos JSON e parsers em projetos full-stack Python.

Sintaxe Básica vs Switch Case

Exemplo clássico de dias da semana, similar a um switch mas com OR nativo (|) e wildcard (_):

def weekday_name(day: int) -> str:
    match day:
        case 1:
            return "Segunda-feira"
        case 2 | 3 | 4 | 5:
            return "Dia útil"
        case 6 | 7:
            return "Fim de semana"
        case _:
            raise ValueError(f"Dia inválido: {day}")

Sem break necessário – o case para automaticamente. Switch tradicional exigiria enum ou strings com fallthrough manual.

Destructuring: Poder Estrutural

O diferencial: padrões que capturam partes de estruturas compostas.

Tuplas e Listas

def process_point(point):
    match point:
        case (0, 0):
            return "Origem"
        case (0, y):
            return f"Eixo Y: {y}"
        case (x, 0):
            return f"Eixo X: {x}"
        case (x, y):
            return f"Ponto: ({x}, {y})"
        case [x, y, *rest]:
            return f"Lista longa: inicia {x},{y} + {len(rest)}"
        case _:
            raise TypeError("Formato inválido")

Captura variáveis diretamente, sem indexação manual – impossível em switch puro.

Dicionários e Eventos

def handle_event(event: dict):
    match event:
        case {"type": "click", "x": x, "y": y}:
            return f"Clique em ({x}, {y})"
        case {"type": "user", "id": uid}:
            return f"Usuário {uid}"
        case _:
            return "Ignorado"

Perfeito para payloads HTTP/JSON em Flask ou FastAPI.

Classes e Dataclasses

from dataclasses import dataclass

@dataclass
class CreateUser:
    email: str

@dataclass
class DeleteUser:
    id: int

def dispatch(cmd):
    match cmd:
        case CreateUser(email=email):
            return f"Criar: {email}"
        case DeleteUser(id=uid):
            return f"Excluir: {uid}"

Desconstrói atributos por nome – switch não acessa objetos assim.

Guards e Padrões Compostos

Combine matching com condições (if) e OR:

def classify(num: int):
    match num:
        case 0:
            return "Zero"
        case x if x > 0:
            return "Positivo"
        case x if x % 2 == 0:
            return "Par negativo"
        case _:
            return "Ímpar negativo."

Guards executam pós-captura, mantendo lógica coesa – superior a ifs externos em switches.

Vantagens sobre Switch Case

Aspecto Switch Case (C/Java) Pattern Matching Python
Comparação Valores escalares Estrutura + valores [4]
Destructuring Não Sim (listas/objetos) [1]
Guards/Condições Externo Integrado no case [2]
Fallthrough Manual (break) Automático [8]
Casos Múltiplos Labels separados `

Reduz if/elif verbosos em 50-70% para roteamento de dados.

Adote pattern matching em seus projetos Python para código mais legível e robusto. Teste os exemplos acima no seu ambiente e compartilhe comigo em @riverfount@bolha.us qual use case você vai aplicar primeiro. Para mais tutoriais avançados em Python, Spring Boot ou microservices, inscreva-se ou pergunte aqui!

 
Read more...

from Riverfount

Procurando por dicionários Python DSA, hash tables em Python, complexidade Big O dict Python ou estruturas de dados Python avançadas? Neste guia técnico desvendamos os princípios internos dos dicionários (dict), desde hashing e colisões até operações otimizadas para algoritmos reais. Ideal para engenheiros de software que buscam performance em microservices, grafos e entrevistas técnicas – leia e eleve seu código Python a outro nível!

Dicionários em Python (dict) são uma implementação eficiente de hash tables (tabelas de hash), uma estrutura de dados essencial em DSA para mapear chaves únicas a valores com acesso médio em tempo constante O(1). Essa performance os torna superiores a listas para operações de busca, inserção e deleção em cenários não ordenados, como caches, contagens de frequência ou representações de grafos. Desde Python 3.7, eles mantêm ordem de inserção, combinando benefícios de hash tables com listas ordenadas.[1]

Implementação Interna e Hashing

Internamente, o Python computa um hash da chave imutável (ex.: hash('chave')) para determinar o índice na tabela subjacente, um array redimensionável. Colisões são resolvidas por open addressing com probing quadrático. Chaves mutáveis (como listas) geram TypeError para evitar inconsistências.

Exemplo de hashing básico:

chave = 'abc'
hash_val = hash(chave)  # Resultado varia por sessão, ex: -123456789
print(f"Hash de '{chave}': {hash_val}")

Isso garante lookups rápidos, mas hashes ruins (ex.: ataques de hash-flooding) degradam para O(n) no pior caso.

Operações Fundamentais com Exemplos

Aqui estão as operações core, com análise de complexidade:

  • Criação e Inicialização:
  # Dict literal
  freq = {'a': 2, 'b': 1}
  
  # From iterable
  from collections import Counter
  freq = Counter('abacaxi')  # {'a': 3, 'b': 1, 'c': 1, 'x': 1, 'i': 1}
  • Inserção/Atualização (O(1) médio):

    freq['z'] = 1  # Insere ou atualiza
    freq.setdefault('y', 0)  # Insere só se ausente
    
  • Busca e Acesso (O(1) médio):

    valor = freq.get('a', 0)  # 3, com default se chave ausente
    if 'a' in freq:  # Verificação segura
      print(freq['a'])
    
  • Remoção (O(1) médio):

    del freq['z']  # Remove chave
    popped = freq.pop('b', None)  # Retorna valor ou default
    
  • Iteração Eficiente:

    # Chaves, valores ou itens
    for chave, valor in freq.items():
      print(f"{chave}: {valor}")
    

Complexidade Assintótica Detalhada

Operação Média (Amortizada) Pior Caso Notas
Inserção O(1) O(n) Redimensiona em load factor ~2/3
Busca (get) O(1) O(n) Colisões extremas
Deleção O(1) O(n) Marca como “tombstone”
Iteração O(n) O(n) Linear no tamanho
Len() O(1) O(1) Armazenado explicitamente

Boas Práticas e Casos de Uso em DSA

  • Evite chaves mutáveis: Use frozenset ou tuplas para chaves compostas.
  • Defaultdict para Simplicidade: python from collections import defaultdict graph = defaultdict(list) graph['A'].append('B') # Lista auto-criada
  • Aplicações:
    • Grafo de Adjacência: adj = {'A': ['B', 'C'], 'B': ['A']} para BFS/DFS.
    • Cache LRU Manual: Track acessos com dict + heapq.
    • Contagem de Frequência: Counter para anagramas ou sliding windows.
  • Alternativas: collections.OrderedDict para popitem(LRU), ou dict com __missing__ customizado.

Em projetos full-stack ou microservices, dicionários otimizam APIs REST (ex.: roteamento por ID) e automação, escalando para milhões de entradas sem gargalos.

Conclusão

Dominar dicionários é o primeiro passo para algoritmos escaláveis em Python – aplique esses conceitos hoje e veja seu código voar! Teste os exemplos no seu ambiente, experimente em LeetCode ou compartilhe em @riverfount@bolha.us como usou em projetos reais.

 
Read more...

from Outras Coisas Mais

Oi! Estou procurando por uma amiga. Pode me ajudar?

Acho que talvez você a conheça:

Ela tem um sorriso gracioso; uma presença radiante; uma personalidade marcante, Ela gosta de dançar na chuva, o que é incrível visto o jeitinho de Paty — mas é só de primeira vista; usa uns vestidos lindos e tem um caminhar tão envolvente; A observar na contra luz do por do sol é de uma magia indescritível e os olhos, ah, aqueles olhos — são como uma doce e terna melodia. E por falar em melodia... O modo dela falar é delicioso, você pode ficar horas a ouvindo; ela tem uma forma curiosa de conversar sobre a vida e uma mania de terminar as frases com “Sabe?” que é tão maravilhoso de ouvir; e é o máximo como ela pronuncia “fácil”; O gosto para filmes é meio estranho; É maconheira; Gosta de ler para viajar a outros mundos— não é o máximo alguém que gosta de ler? E por incrível que pareça, ela gosta dos meus poemas. Ou parecia gostar. Ela tem alergia a pimenta; faz umas panquecas que parecem ser muito, muito saborosas; gosta de jabuticabas e coisas com canela — já falei das panquecas? E não gosta de lavar a louça, principalmente panelas; Ela é Bartender; gosta de jogar bilhar; virar shots e apreciar drinks — lembro de um tal Fritzgerald. Costuma ser um tanto distante, excessivamente focada no trabalho e ultimamente, tem parecido menos afetuosa — ou talvez seja um equívoco meu. Mas eu entendo esse jeito dela ser, e amo esse jeito dela ser.

Ah! Ela é inteligentíssima e escreve textos maravilhosos — que estou com saudade de ler.

Viu ela por aí? Se a vir, diga que mandei um abraço e que estou com saudade. E que quando ela puder e quiser, que me dê notícias de como está se sentindo.

Carta enviada para amiga
 
Leia mais...