AttributeError on `with super()`
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
Writing with super() raises an AttributeError. I ran into this implementing context managers inspired by contextlib.contextmnager but which had extra functionality. I can see no reason why with super() should be disallowed, and in fact, super().__enter__() and super().__exit__() work just fine.
Attempting to use an ExitStack as a work around was unsuccessful.
import sys
from contextlib import ExitStack
class Base:
def __enter__(self):
print("Entering base context manager")
def __exit__(self, type, value, traceback):
print("Exiting base context manager")
def __derived_enter__(self):
self.context = self.contextlib_style_context()
next(self.context)
return self.context
def __derived_exit__(self, type, value, traceback):
try:
next(self.context)
except StopIteration:
pass
class DerivedUsingEnterExit(Base):
def contextlib_style_context(self):
print("Entering contextlib style context manager")
super().__enter__()
try:
yield
finally:
super().__exit__(*sys.exc_info())
print("Exiting contextlib style context manager")
__enter__ = __derived_enter__
__exit__ = __derived_exit__
class DerivedUsingWith(Base):
def contextlib_style_context(self):
print("Entering contextlib style context manager")
with super():
yield
print("Exiting contextlib style context manager")
__enter__ = __derived_enter__
__exit__ = __derived_exit__
class DerivedUsingExitStack(Base):
def contextlib_style_context(self):
print("Entering contextlib style context manager")
with ExitStack() as stack:
stack.enter_context(super())
yield
print("Exiting contextlib style context manager")
__enter__ = __derived_enter__
__exit__ = __derived_exit__
# Runs successfully
with DerivedUsingEnterExit() as d:
pass
# Raises AttributeError
with DerivedUsingWith() as d:
pass
# Raises AttributeError
with DerivedUsingExitStack() as d:
pass
CPython versions tested on:
3.13, 3.12
Operating systems tested on:
Windows
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par reproduire les exemples fournis de DerivedUsingWith et DerivedUsingExitStack sur CPython 3.13 ou 3.12, puis suivez les points d’entrée de super() et du gestionnaire de contexte impliqués. Comparez-les au cas fonctionnel super().enter() et super().exit() ; terminé signifie que le comportement attendu est établi et que l’AttributeError signalée est couverte par un test de régression.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100