python / python/cpython

configparser: whitespace not stripped when writing empty values

Abierto
#157,466 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

stdlib type-feature
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug description:

When writing a configparser.ConfigParser to a file, keys with an empty value add a whitespace at the end of the line.

Eg. a line key = , ending with a whitespace.

import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ok': 'value', 'error': ''}
with open("test.ini", "w") as fhandle:
    config.write(fhandle)

Now the contents of test.ini are:

[DEFAULT]
ok = value
error = 

The line with the key "error" ends in a space. It appears the extra whitespace is introduced in ConfigParser.write(). Whitespaces are added to the delimiter, but this does not account for empty values.

class ConfigParser:
    def write(self, fp, space_around_delimiters=True):
        if space_around_delimiters:
            d = " {} ".format(self._delimiters[0])
        ...

Stripping the whitespace of the value in ConfigParser._write_section() solves this.

class ConfigParser:
    def _write_section(self, fp, section_name, section_items, delimiter, unnamed=False):
        if not unnamed:
            fp.write(f"[{section_name}]\n")
        for key, value in section_items:
            self._validate_key_contents(key)
            value = self._interpolation.before_write(
                self, section_name, key, value
            )
            if value is not None or not self._allow_no_value:
                # Convert all possible line-endings into '\n\t'
                value = (delimiter + str(value).replace('\r\n', '\n')
                         .replace('\r', '\n').replace('\n', '\n\t'))
            else:
                value = ""
            # Change from the original: strip empty space to avoid "key = " for
            # empty keys!!!
            line = f"{key}{value}".strip(" ")
            fp.write(f"{line}\n")
            # Done with changes.
        fp.write("\n")
CPython versions tested on:

3.14

Operating systems tested on:

Linux

Linked PRs
  • gh-157467

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en ConfigParser.write() y _write_section(), que el issue identifica como los puntos de entrada donde se introduce el espacio final. Añade cobertura para escribir un valor vacío y verifica que la línea INI generada no tenga espacios en blanco al final; después, ejecuta las pruebas relevantes de configparser. En el issue ya se indica un PR vinculado.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
tooling
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.