Issue1159

classification
Title: custum number and float: unsupported operand type(s) for *
Type: Severity: normal
Components: Versions:
Milestone:
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: certik, pjenvey
Priority: Keywords:

Created on 2008-10-26.22:14:11 by certik, last changed 2008-10-28.21:52:36 by pjenvey.

Messages
msg3703 (view) Author: Ondrej Certik (certik) Date: 2008-10-26.22:14:10
Run this file:

-----------------

class DummyNumber(object):
    """
    Minimal implementation of a number that works with SymPy.

    If one has a Number class (e.g. Sage Integer, or some other custom
class)
    that one wants to work well with SymPy, one has to implement at
least the
    methods of this class DummyNumber, resp. it's subclasses I5 and F1_1.

    Basically, one just needs to implement either __int__() or
__float__() and
    then one needs to make sure that the class works with Python
integers and
    with itself.
    """

    def __radd__(self, a):
        if isinstance(a, (int, float)):
            return a + self.number
        return NotImplemented

    def __add__(self, a):
        if isinstance(a, (int, float, DummyNumber)):
            return self.number + a
        return NotImplemented

    def __rsub__(self, a):
        if isinstance(a, (int, float)):
            return a - self.number
        return NotImplemented

    def __sub__(self, a):
        if isinstance(a, (int, float, DummyNumber)):
            return self.number - a
        return NotImplemented

    def __rmul__(self, a):
        if isinstance(a, (int, float)):
            return a * self.number
        return NotImplemented

    def __mul__(self, a):
        if isinstance(a, (int, float, DummyNumber)):
            return self.number * a
        return NotImplemented

    def __rdiv__(self, a):
        if isinstance(a, (int, float)):
            return a / self.number
        return NotImplemented

    def __div__(self, a):
        if isinstance(a, (int, float, DummyNumber)):
            return self.number / a
        return NotImplemented

    def __rpow__(self, a):
        if isinstance(a, (int, float)):
            return a ** self.number
        return NotImplemented

    def __pow__(self, a):
        if isinstance(a, (int, float, DummyNumber)):
            return self.number ** a
        return NotImplemented

    def __pos__(self):
        return self.number

    def __neg__(self):
        return - self.number

class I5(DummyNumber):
    number = 5
    def __int__(self):
        return self.number

class F1_1(DummyNumber):
    number = 1.1
    def __float__(self):
        return self.number

i5 = I5()
f1_1 = F1_1()

print f1_1**i5
print f1_1**f1_1

-----------------

$ jython w.py 
Traceback (most recent call last):
  File "w.py", line 83, in <module>
    print f1_1**i5
java.lang.NullPointerException
	at org.python.core.StdoutWrapper.print(StdoutWrapper.java:108)
	at org.python.core.StdoutWrapper.println(StdoutWrapper.java:167)
	at org.python.core.Py.println(Py.java:1316)
	at org.python.pycode._pyx0.f$0(w.py)
	at org.python.pycode._pyx0.call_function(w.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:199)
	at org.python.core.PyCode.call(PyCode.java:14)
	at org.python.core.Py.runCode(Py.java:1201)
	at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:155)
	at org.python.util.jython.run(jython.java:226)
	at org.python.util.jython.main(jython.java:113)

java.lang.NullPointerException: java.lang.NullPointerException


----------

if you comment out the "print f1_1**i5", it fails here:

------------

$ jython w.py 
Traceback (most recent call last):
  File "w.py", line 84, in <module>
    print f1_1**f1_1
TypeError: unsupported operand type(s) for **: 'F1_1' and 'F1_1'
msg3719 (view) Author: Philip Jenvey (pjenvey) Date: 2008-10-28.21:52:35
fixed in r5524, thanks Ondrej
History
Date User Action Args
2008-10-28 21:52:36pjenveysetstatus: open -> closed
resolution: fixed
messages: + msg3719
nosy: + pjenvey
2008-10-26 22:14:11certikcreate