Skip to content

Commit f9c5bcd

Browse files
committed
Fix getting string representation of sage objects
1 parent 29c4264 commit f9c5bcd

File tree

4 files changed

+16
-21
lines changed

4 files changed

+16
-21
lines changed

symengine/lib/pywrapper.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -175,17 +175,12 @@ RCP<const Number> PyNumber::eval(long bits) const {
175175
}
176176

177177
std::string PyNumber::__str__() const {
178-
PyObject* temp;
179-
std::string str;
180-
#if PY_MAJOR_VERSION > 2
181-
temp = PyUnicode_AsUTF8String(pyobject_);
182-
str = std::string(PyBytes_AsString(temp));
183-
#else
184-
temp = PyObject_Str(pyobject_);
185-
str = std::string(PyString_AsString(temp));
186-
#endif
187-
Py_XDECREF(temp);
188-
return str;
178+
Py_ssize_t size;
179+
PyObject *pystr = PyObject_Str(pyobject_);
180+
const char* data = PyUnicode_AsUTF8AndSize(pystr, &size);
181+
std::string result = std::string(data, size);
182+
Py_XDECREF(pystr);
183+
return result;
189184
}
190185

191186
// PyFunctionClass

symengine/lib/symengine_wrapper.pyx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2690,7 +2690,7 @@ class FunctionSymbol(Function):
26902690
def _sage_(self):
26912691
import sage.all as sage
26922692
name = self.get_name()
2693-
return sage.function(name, *self.args_as_sage())
2693+
return sage.function(name)(*self.args_as_sage())
26942694

26952695
def func(self, *values):
26962696
name = self.get_name()
@@ -2711,7 +2711,7 @@ cdef rcp_const_basic pynumber_to_symengine(PyObject* o1):
27112711

27122712
cdef PyObject* symengine_to_sage(rcp_const_basic o1):
27132713
import sage.all as sage
2714-
t = sage.SR(c2py(o1)._sage_())
2714+
t = c2py(o1)._sage_()
27152715
Py_XINCREF(<PyObject*>t)
27162716
return <PyObject*>(t)
27172717

@@ -2765,7 +2765,10 @@ cdef class PyNumber(Number):
27652765

27662766
def _sage_(self):
27672767
import sage.all as sage
2768-
return sage.SR(self.pyobject())
2768+
res = self.pyobject()
2769+
if hasattr(res, '_sage_'):
2770+
return res._sage_()
2771+
return res
27692772

27702773
def pyobject(self):
27712774
return <object>deref(symengine.rcp_static_cast_PyNumber(self.thisptr)).get_py_object()

symengine/tests/test_sage.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ def test_sage_conversions():
6666
assert cos(x1)._sage_() == sage.cos(x)
6767
assert cos(x1) == sympify(sage.cos(x))
6868

69-
assert function_symbol('f', x1, y1)._sage_() == sage.function('f', x, y)
69+
assert function_symbol('f', x1, y1)._sage_() == sage.function('f')(x, y)
7070
assert (function_symbol('f', 2 * x1, x1 + y1).diff(x1)._sage_() ==
71-
sage.function('f', 2 * x, x + y).diff(x))
71+
sage.function('f')(2 * x, x + y).diff(x))
7272

7373
assert LambertW(x1) == LambertW(x)
7474
assert LambertW(x1)._sage_() == sage.lambert_w(x)
@@ -142,11 +142,7 @@ def test_sage_conversions():
142142
b = b + 8
143143
assert isinstance(b, PyNumber)
144144
assert b._sage_() == a
145-
146-
a = a + x
147-
b = b + x
148-
assert isinstance(b, Add)
149-
assert b._sage_() == a
145+
assert str(a) == str(b)
150146

151147
# Sage Function
152148
e = x1 + wrap_sage_function(sage.log_gamma(x))

symengine/tests/test_sympy_conv.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,7 @@ def test_pynumber():
760760
assert isinstance(b, PyNumber)
761761
assert b == a # Check equality via SymEngine
762762
assert a == b # Check equality via SymPy
763+
assert str(a) == str(b)
763764

764765
a = 1 - a
765766
b = 1 - b

0 commit comments

Comments
 (0)