Author: Philip Jenvey <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit