Can't pickle a bound method if `getattr(type(im_self), funcname)` fails
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 36k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza reproduciendo el MWE con pickle.dumps y pickle.loads, centrándote en el método vinculado asignado a Foo.f2 y en el error reportado de getattr(type(im_self), funcname). Rastrea el comportamiento de ida y vuelta del método y el manejo existente de pickle; se considera completado cuando el ejemplo se deserializa correctamente e imprime [[1.]].
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
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Necesita aclaración
- Aptitud para principiantes
- 25/100