def descr__new__(space, w_complextype, w_real, w_imag=None): from pypy.objspace.std.complexobject import W_ComplexObject # if w_real is already a complex number and there is no second # argument, return it. Note that we cannot return w_real if # it is an instance of a *subclass* of complex, or if w_complextype # is itself a subclass of complex. noarg2 = w_imag is None if (noarg2 and space.is_w(w_complextype, space.w_complex) and space.is_w(space.type(w_real), space.w_complex)): return w_real if space.isinstance_w(w_real, space.w_str) or \ space.isinstance_w(w_real, space.w_unicode): # a string argument if not noarg2: raise OperationError( space.w_TypeError, space.wrap("complex() can't take second arg" " if first is a string")) try: realstr, imagstr = _split_complex(space.str_w(w_real)) except ValueError: raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED)) try: realval = string_to_float(realstr) imagval = string_to_float(imagstr) except ParseStringError: raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED)) else: # non-string arguments realval, imagval = unpackcomplex(space, w_real, strict_typing=False) # now take w_imag into account if not noarg2: # complex(x, y) == x+y*j, even if 'y' is already a complex. realval2, imagval2 = unpackcomplex(space, w_imag, strict_typing=False) # try to preserve the signs of zeroes of realval and realval2 if imagval2 != 0.0: realval -= imagval2 if imagval != 0.0: imagval += realval2 else: imagval = realval2 # done w_obj = space.allocate_instance(W_ComplexObject, w_complextype) W_ComplexObject.__init__(w_obj, realval, imagval) return w_obj
def descr__new__(space, w_complextype, w_real, w_imag=None): from pypy.objspace.std.complexobject import W_ComplexObject # if w_real is already a complex number and there is no second # argument, return it. Note that we cannot return w_real if # it is an instance of a *subclass* of complex, or if w_complextype # is itself a subclass of complex. noarg2 = w_imag is None if (noarg2 and space.is_w(w_complextype, space.w_complex) and space.is_w(space.type(w_real), space.w_complex)): return w_real if space.isinstance_w(w_real, space.w_str) or \ space.isinstance_w(w_real, space.w_unicode): # a string argument if not noarg2: raise OperationError(space.w_TypeError, space.wrap("complex() can't take second arg" " if first is a string")) try: realstr, imagstr = _split_complex(space.str_w(w_real)) except ValueError: raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED)) try: realval = string_to_float(realstr) imagval = string_to_float(imagstr) except ParseStringError: raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED)) else: # non-string arguments realval, imagval = unpackcomplex(space, w_real, strict_typing=False) # now take w_imag into account if not noarg2: # complex(x, y) == x+y*j, even if 'y' is already a complex. realval2, imagval2 = unpackcomplex(space, w_imag, strict_typing=False) # try to preserve the signs of zeroes of realval and realval2 if imagval2 != 0.0: realval -= imagval2 if imagval != 0.0: imagval += realval2 else: imagval = realval2 # done w_obj = space.allocate_instance(W_ComplexObject, w_complextype) W_ComplexObject.__init__(w_obj, realval, imagval) return w_obj
a = space.float_w(space.getattr(w_imag, space.wrap('real'))) b = space.float_w(space.getattr(w_imag, space.wrap('imag'))) realval -= b imagval += a elif space.is_true(space.isinstance(w_imag, space.w_str)) or \ space.is_true(space.isinstance(w_imag, space.w_unicode)): # prevent space.float(w_imag) from succeeding raise OperationError( space.w_TypeError, space.wrap("complex() second arg" " can't be a string")) else: imagval += space.float_w(space.float(w_imag)) # done w_obj = space.allocate_instance(W_ComplexObject, w_complextype) W_ComplexObject.__init__(w_obj, realval, imagval) return w_obj def complexwprop(name): def fget(space, w_obj): from pypy.objspace.std.complexobject import W_ComplexObject if not isinstance(w_obj, W_ComplexObject): raise OperationError(space.w_TypeError, space.wrap("descriptor is for 'complex'")) return space.newfloat(getattr(w_obj, name)) return GetSetProperty(fget) def descr___getnewargs__(space, w_self):
# say y == a+b*j: a = space.float_w(space.getattr(w_imag, space.wrap('real'))) b = space.float_w(space.getattr(w_imag, space.wrap('imag'))) realval -= b imagval += a elif space.is_true(space.isinstance(w_imag, space.w_str)) or \ space.is_true(space.isinstance(w_imag, space.w_unicode)): # prevent space.float(w_imag) from succeeding raise OperationError(space.w_TypeError, space.wrap("complex() second arg" " can't be a string")) else: imagval += space.float_w(space.float(w_imag)) # done w_obj = space.allocate_instance(W_ComplexObject, w_complextype) W_ComplexObject.__init__(w_obj, realval, imagval) return w_obj def complexwprop(name): def fget(space, w_obj): from pypy.objspace.std.complexobject import W_ComplexObject if not isinstance(w_obj, W_ComplexObject): raise OperationError(space.w_TypeError, space.wrap("descriptor is for 'complex'")) return space.newfloat(getattr(w_obj, name)) return GetSetProperty(fget) def descr___getnewargs__(space, w_self): from pypy.objspace.std.complexobject import W_ComplexObject assert isinstance(w_self, W_ComplexObject) return space.newtuple([space.newcomplex(w_self.realval,w_self.imagval)])