Exception that calls `super().__init__` breaks `copy.copy`
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:
For some reason calling Exception.__init__ breaks copy.copys ability to detect args. The following code
import copy
class MyException(Exception):
def __init__(self, x):
super().__init__()
self.x = x
my_exc = MyException(5)
copy.copy(my_exc)
gives
Traceback (most recent call last):
File "./foo.py", line 9, in <module>
copy.copy(my_exc)
File "/usr/lib/python3.12/copy.py", line 97, in copy
return _reconstruct(x, None, *rv)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/copy.py", line 253, in _reconstruct
y = func(*args)
^^^^^^^^^^^
TypeError: MyException.__init__() missing 1 required positional argument: 'x'
Removing the super().__init__() line makes everything work as expected, but given that it's generally seen as good practice to call super().__init__() in child classes, and you may be working with a more complex class structure, this seems like pretty bad behavior.
I haven't dug deep enough into copy.copy or BaseException.__init__ to decide which one deserves the blame.
For the reason why I want to copy exceptions, see https://github.com/python-trio/flake8-async/issues/298
CPython versions tested on:
3.9, 3.10, 3.11, 3.12, 3.13, 3.14
Operating systems tested on:
Linux
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
Reproduisez l’exemple avec copy.copy et examinez le comportement dans /usr/lib/python3.12/copy.py avec BaseException.init. Déterminez le comportement de copie attendu pour une Exception dont l’initialiseur appelle super().init(), puis ajoutez un test de régression montrant que la copie préserve l’état requis du constructeur sans lever de TypeError.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100