Redirecting stdout failure with help function inside `__repr__`

Ouverte
#101,624 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
python
Domaine
tooling

Piste de recherche

Commencez par reproduire l’exemple avec contextlib.redirect_stdout, StringIO, help(), un repr imbriqué et des affectations de doc sur des instances dans les versions de CPython signalées. Suivez la façon dont help() formate l’objet et écrit la sortie lors des premier et deuxième appels. C’est terminé lorsque la reproduction ne laisse plus s’échapper la sortie de help() et ne lève plus IndexError avec stdout redirigé.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

interpreter-core type-bug

Bug report

Despite modifying sys.stdout, the help function appears to ignore it sometimes during nested usage within __repr__ and with instance __doc__ attributes.

Example:

from contextlib import redirect_stdout
from io import StringIO


class ReprDoc:
    """Class doc-string."""

    def __init__(self, value):
        self.__doc__ = value.__doc__
        self.value = value

    def __repr__(self):
        print("<===Starting Stdout Redirect===>")
        with redirect_stdout(StringIO()) as doc:
            help(self.value)
        print("<===Stopping Stdout Redirect===>")
        return doc.getvalue().splitlines()[2]


def foo():
    """Foo doc-string."""

help(ReprDoc(foo))
help(ReprDoc(foo))

Output:

<===Starting Stdout Redirect===>
<===Stopping Stdout Redirect===>
Help on ReprDoc in module __main__:

foo()
    Foo doc-string.

<===Starting Stdout Redirect===>
Help on function foo in module __main__:

foo()
    Foo doc-string.
<===Stopping Stdout Redirect===>
Traceback (most recent call last):
  ...
IndexError: list index out of range

Checking sys.stdout affirms it is correct at every step, and using print with the redirected stdout affirms that the problem comes from help itself.

I imagine this problem is related to the use of self.__doc__ assignments, though the behavior is very strange because it works the first time and then fails the second time.

Your environment

  • CPython versions tested on: >= 3.8
  • Operating system and architecture: Windows 11
Langage dominant
Python
Étoiles
77.2k
Forks
36k
Merge moyen
1 j 9 h
PR mergées (30 j)
558

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de python/cpython

Toutes les issues de python/cpython

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.