Variable declared without a value suppresses ${VAR:-default} expansion

Aberta Para iniciantes
#750 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 12 dias

@Omarinho12345 já está trabalhando nisso.

Desde 11/11/2026.

  • #751 de @Omarinho12345 — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
85/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
backend

Direção de pesquisa

A issue aponta Variable.resolve() em src/dotenv/variables.py e apresenta uma reprodução mínima com dotenv_values(). Leia primeiro esse método e os testes de expansão de variáveis; em seguida, verifique como um valor None é tratado para ${A} e ${A:-fallback}. O resultado esperado é que a forma com valor padrão use esse valor, enquanto ${A} continue sendo expandido para uma string vazia.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Environment

  • python-dotenv 1.2.4 (main, commit 4fbc6ff)
  • Python 3.14.0 on Windows 11; the code involved is platform independent

Minimal repro

import io
from dotenv import dotenv_values

print(dotenv_values(stream=io.StringIO("A\nB=${A:-fallback}")))

Actual

OrderedDict({'A': None, 'B': ''})

Expected

OrderedDict({'A': None, 'B': 'fallback'})

${A} should still expand to ""; only the defaulted form is affected.

Why this is wrong

The README's "Variable expansion" section lists the resolution order for
dotenv_values() as: value of the variable in the .env file, value in the
environment, default value, then empty string. A key written without a value
(A) is documented earlier as producing None, and load_dotenv is said to
"simply ignore such variables" — that is, the variable is unset, not set to the
empty string. Since the default is only skipped when the variable has a value,
${A:-fallback} should produce fallback here.

This also contradicts the explicit distinction the README draws between FOO
and FOO=: A and A= currently expand identically ("") even though only
A= is the empty string.

The cause is in Variable.resolve() (src/dotenv/variables.py): a name that is
present in the mapping with a None value is converted to "", so the
supplied default is never used.

Linguagem predominante
Python
Estrelas
8.9k
Forks
618
Merge médio
12d 6min
PRs com merge (30d)
3

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de theskumar/python-dotenv

Todas as issues de theskumar/python-dotenv

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.