[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