[pypy-svn] r49655 - in pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Tue Dec 11 22:49:31 CET 2007
Author: cfbolz
Date: Tue Dec 11 22:49:30 2007
New Revision: 49655
Modified:
pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
Log:
support for __str__ and __repr__
Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py (original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py Tue Dec 11 22:49:30 2007
@@ -149,6 +149,17 @@
space.wrap("this constructor takes no arguments"))
return w_inst
+ def get_module_string(self, space):
+ try:
+ w_mod = self.descr_getattribute(space, space.wrap("__module__"))
+ except OperationError, e:
+ if not e.match(space, space.w_AttributeError):
+ raise
+ return "?"
+ if space.is_true(space.isinstance(w_mod, space.w_str)):
+ return space.str_w(w_mod)
+ return "?"
+
W_ClassObject.typedef = TypeDef("classobj",
__new__ = interp2app(descr_classobj_new),
__dict__ = GetSetProperty(W_ClassObject.fget_dict, W_ClassObject.fset_dict,
@@ -246,6 +257,20 @@
#import pdb; pdb.set_trace()
return self.getattr(space, w_attr)
+ def descr_repr(self, space):
+ w_meth = self.getattr(space, space.wrap('__repr__'), False)
+ if w_meth is None:
+ w_class = self.w_class
+ mod = w_class.get_module_string(space)
+ return self.getrepr(space, "%s.%s instance" % (mod, w_class.name))
+ return space.call_function(w_meth)
+
+ def descr_str(self, space):
+ w_meth = self.getattr(space, space.wrap('__str__'), False)
+ if w_meth is None:
+ return self.descr_repr(space)
+ return space.call_function(w_meth)
+
def descr_len(self, space):
w_meth = self.getattr(space, space.wrap('__len__'))
w_result = space.call_function(w_meth)
@@ -300,6 +325,10 @@
W_InstanceObject.fset_class),
__getattribute__ = interp2app(W_InstanceObject.descr_getattribute,
unwrap_spec=['self', ObjSpace, W_Root]),
+ __repr__ = interp2app(W_InstanceObject.descr_repr,
+ unwrap_spec=['self', ObjSpace]),
+ __str__ = interp2app(W_InstanceObject.descr_str,
+ unwrap_spec=['self', ObjSpace]),
__len__ = interp2app(W_InstanceObject.descr_len,
unwrap_spec=['self', ObjSpace]),
__getitem__ = interp2app(W_InstanceObject.descr_getitem,
Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py (original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py Tue Dec 11 22:49:30 2007
@@ -247,3 +247,28 @@
raises(ValueError, "assert a")
a = A("hello")
raises(TypeError, "assert a")
+
+ def test_repr(self):
+ class A:
+ __metaclass__ = nclassobj
+ a = A()
+ assert repr(a).startswith("<__builtin__.A instance at")
+ assert str(a).startswith("<__builtin__.A instance at")
+ A.__name__ = "Foo"
+ assert repr(a).startswith("<__builtin__.Foo instance at")
+ assert str(a).startswith("<__builtin__.Foo instance at")
+ class A:
+ __metaclass__ = nclassobj
+ def __repr__(self):
+ return "foo"
+ assert repr(A()) == "foo"
+ assert str(A()) == "foo"
+
+ def test_str(self):
+ class A:
+ __metaclass__ = nclassobj
+ def __str__(self):
+ return "foo"
+ a = A()
+ assert repr(a).startswith("<__builtin__.A instance at")
+ assert str(a) == "foo"
More information about the Pypy-commit
mailing list