Author: Philip Jenvey <pjen...@underboss.org> Branch: py3k Changeset: r84553:ccfc9fe7d495 Date: 2016-05-21 12:43 -0700 http://bitbucket.org/pypy/pypy/changeset/ccfc9fe7d495/
Log: __qualname__ for getset_descriptors diff --git a/lib-python/3/test/test_descr.py b/lib-python/3/test/test_descr.py --- a/lib-python/3/test/test_descr.py +++ b/lib-python/3/test/test_descr.py @@ -4526,6 +4526,10 @@ # make sure we have an example of each type of descriptor for d, n in zip(descriptors, types): + if (support.check_impl_detail(pypy=True) and + n in ('method', 'member', 'wrapper')): + # PyPy doesn't have these + continue self.assertEqual(type(d).__name__, n + '_descriptor') for d in descriptors: @@ -4539,7 +4543,7 @@ class X: pass - with self.assertRaises(TypeError): + with self.assertRaises((AttributeError, TypeError)): del X.__qualname__ self.assertRaises(TypeError, type.__dict__['__qualname__'].__set__, diff --git a/pypy/interpreter/test/test_typedef.py b/pypy/interpreter/test/test_typedef.py --- a/pypy/interpreter/test/test_typedef.py +++ b/pypy/interpreter/test/test_typedef.py @@ -60,6 +60,7 @@ def test_descr_getsetproperty(self): from types import FrameType assert FrameType.f_lineno.__name__ == 'f_lineno' + assert FrameType.f_lineno.__qualname__ == 'frame.f_lineno' assert FrameType.f_lineno.__objclass__ is FrameType class A(object): pass diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -263,6 +263,7 @@ self.doc = doc self.reqcls = cls self.name = '<generic property>' + self.qualname = None self.objclass_getter = objclass_getter self.use_closure = use_closure @@ -313,6 +314,21 @@ self.reqcls, Arguments(space, [w_obj, space.wrap(self.name)])) + def descr_get_qualname(self, space): + if self.qualname is None: + self.qualname = self._calculate_qualname(space) + return self.qualname + + def _calculate_qualname(self, space): + if self.reqcls is None: + type_qualname = u'?' + else: + w_type = space.gettypeobject(self.reqcls.typedef) + type_qualname = space.unicode_w( + space.getattr(w_type, space.wrap('__qualname__'))) + qualname = u"%s.%s" % (type_qualname, self.name.decode('utf-8')) + return space.wrap(qualname) + def descr_get_objclass(space, property): return property.objclass_getter(space) @@ -351,6 +367,7 @@ __set__ = interp2app(GetSetProperty.descr_property_set), __delete__ = interp2app(GetSetProperty.descr_property_del), __name__ = interp_attrproperty('name', cls=GetSetProperty), + __qualname__ = GetSetProperty(GetSetProperty.descr_get_qualname), __objclass__ = GetSetProperty(GetSetProperty.descr_get_objclass), __doc__ = interp_attrproperty('doc', cls=GetSetProperty), ) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit