Can't pickle a bound method if `getattr(type(im_self), funcname)` fails
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 36k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
MWE:
import pickle
import numpy as np
from scipy.interpolate import RectBivariateSpline
class Foo:
def __init__(self):
x = np.linspace(0,1,10)[:,None]
y = np.linspace(2,3,9)[None,:]
self.f = RectBivariateSpline(x,y,x*y)
def f2(self,x,y):
return self.f(x,y)
self.f2 = f2.__get__(self)
foo = Foo()
pickled = pickle.dumps(foo)
unpickled = pickle.loads(pickled)
print(unpickled.f2(0.5, 0.6))
Expected output is to print [[1.]]. Actually gives an exception
Traceback (most recent call last):
File ".../pickle-test.py", line 18, in <module>
unpickled = pickle.loads(pickled)
AttributeError: 'Foo' object has no attribute 'f2'
This issue follows up from the identification an fixing of the same issue with dill, see
https://github.com/uqfoundation/dill/issues/510
https://github.com/uqfoundation/dill/pull/511
where @anivegesana commented
It seems to be a little bit more subtle than that. Because Python 3 implements its own reduce function for methods, I removed it from dill. It turns out that this is not a safe optimization in the case that the func is an inner function. Will be fixed soon.
Your environment
- CPython versions tested on: 3.9.10
- Operating system and architecture: Linux Mint 20.2 on x86-64
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 le MWE avec pickle.dumps et pickle.loads, en vous concentrant sur la méthode liée affectée à Foo.f2 et sur l’échec signalé de getattr(type(im_self), funcname). Suivez le comportement aller-retour de la méthode et la gestion existante de pickle ; le travail est terminé lorsque l’exemple se désérialise correctement et affiche [[1.]].
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 25/100