Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

An empty list or mapping is expanded as a defined value: `{x,v}` with `v=[]` gives `1,`, `{#v}` gives `#`, `{;v}` gives `;v=`

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

Ninguém assumiu esta issue ainda.

Avaliação

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

Direção de pesquisa

Leia uritemplate/variable.py, especialmente _string_expansion e _semi_path_expansion, e compare como eles tratam listas e mapeamentos vazios com _query_expansion e _label_path_expansion. Reproduza os casos relatados com o comando Python da issue e, em seguida, execute as suítes de testes do projeto e do RFC uritemplate-test. O trabalho estará concluído quando as coleções vazias forem tratadas como indefinidas nas expansões afetadas e as saídas esperadas listadas passarem.

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

Descrição

Versions tested: uritemplate 4.2.0 from PyPI (the newest release on 2026-10-23) and the main branch at
8e46228e5a1ad3f688b21c6b3917d15dd0f7c581 (its head on 2026-10-23); CPython 3.10 and 3.11 on Linux.

Reproduce (one command):

python3 -c 'from uritemplate import expand; print(repr(expand("{x,v}", {"x": "1", "v": []})))'

An empty list is an ordinary value for a variable that has none to give, and RFC 6570 covers it.

Expected: '1'. RFC 6570 section 2.3: "A variable defined as a list value is considered undefined if the list contains zero members. A
variable defined as an associative array of (name, value) pairs is considered undefined if the array contains zero members or if all member
names in the array are associated with undefined values." Section 3.2.1: "A variable that is undefined (Section 2.3) has no value and is ignored by the expansion process. If all of the
variables in an expression are undefined, then the expression's expansion is the empty string." The algorithm in Appendix A says the same:
"If the varname is unknown or corresponds to a variable with an undefined value (Section 2.3), then skip to the next varspec". The separator
is appended only between defined variables.

Observed (the same on 4.2.0 and on main):

'1,'

More cases, all with x="1" (tool output / what the RFC text gives):

template v observed expected
{+x,v} [] 1, 1
{#x,v} [] #1, #1
{#v} [] or {} # (empty)
{;x,v} [] ;x=1;v= ;x=1
{;v} {} ;v= (empty)
{;v*} {} ; (empty)

Controls, correct today: {/x,v} -> /1, {.x,v} -> .1, {?x,v} -> ?x=1, {&x,v} -> &x=1, and {x,w} with w not given -> 1.

Where

In uritemplate/variable.py (same on main and in 4.2.0), _query_expansion returns None for an empty list or mapping (if not value: return None, in both the list and the mapping branch) and _label_path_expansion does the same (len(value) == 0), which is why /, ., ? and & are correct. _string_expansion (used by the simple, + and # operators) has no such check, and _semi_path_expansion has it only in its list-explode branch ({;v*} with [] correctly gives ''), so in the other cases the empty collection is expanded as a defined, empty value. Adding the same early return to those two functions made every case above agree with the RFC text and left the project's own test suite and the RFC's uritemplate-test suite green on this machine; that is only a local check, not a proposed patch.

Found by comparing the library with a small model of the RFC's expansion algorithm on generated templates and values, then confirmed against an independent implementation (uri-template 1.3.0 on PyPI), which gives '1', '' and ';v' for the three cases.

Linguagem predominante
Python
Estrelas
246
Forks
41
Merge médio
8h 20min
PRs com merge (30d)
3

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

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 python-hyper/uritemplate

Todas as issues de python-hyper/uritemplate

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.