Skip to content
Snippets Groups Projects

Fix deepcopying on Python 3.11

Merged Michael Kuron requested to merge py311 into master
from collections import defaultdict
from collections import defaultdict
from functools import partial
from functools import partial
 
import sys
from typing import Tuple, Union, Sequence
from typing import Tuple, Union, Sequence
import numpy as np
import numpy as np
@@ -187,18 +188,15 @@ def get_type_of_expression(expr,
@@ -187,18 +188,15 @@ def get_type_of_expression(expr,
# Fix for sympy versions from 1.9
# Fix for sympy versions from 1.9
sympy_version = sp.__version__.split('.')
sympy_version = sp.__version__.split('.')
if int(sympy_version[0]) * 100 + int(sympy_version[1]) >= 109:
sympy_version_int = int(sympy_version[0]) * 100 + int(sympy_version[1])
 
if sympy_version_int >= 109:
# __setstate__ would bypass the contructor, so we remove it
# __setstate__ would bypass the contructor, so we remove it
sp.Number.__getstate__ = sp.Basic.__getstate__
if sympy_version_int >= 111:
del sp.Basic.__getstate__
del sp.Basic.__setstate__
del sp.Symbol.__setstate__
class FunctorWithStoredKwargs:
else:
def __init__(self, func, **kwargs):
sp.Number.__getstate__ = sp.Basic.__getstate__
self.func = func
del sp.Basic.__getstate__
self.kwargs = kwargs
def __call__(self, *args):
return self.func(*args, **self.kwargs)
# __reduce_ex__ would strip kwargs, so we override it
# __reduce_ex__ would strip kwargs, so we override it
def basic_reduce_ex(self, protocol):
def basic_reduce_ex(self, protocol):
@@ -210,9 +208,7 @@ if int(sympy_version[0]) * 100 + int(sympy_version[1]) >= 109:
@@ -210,9 +208,7 @@ if int(sympy_version[0]) * 100 + int(sympy_version[1]) >= 109:
state = self.__getstate__()
state = self.__getstate__()
else:
else:
state = None
state = None
return FunctorWithStoredKwargs(type(self), **kwargs), args, state
return partial(type(self), **kwargs), args, state
sp.Number.__reduce_ex__ = sp.Basic.__reduce_ex__
sp.Basic.__reduce_ex__ = basic_reduce_ex
sp.Basic.__reduce_ex__ = basic_reduce_ex