[Python-checkins] GH-95822: Need _PyType_Lookup() in descriptor howto code equivalent. (GH-95967) (#96100)

rhettinger webhook-mailer at python.org
Fri Aug 19 01:19:09 EDT 2022


https://github.com/python/cpython/commit/b6e8304b25e3a83e33b280405f6e37516cad1522
commit: b6e8304b25e3a83e33b280405f6e37516cad1522
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: rhettinger <rhettinger at users.noreply.github.com>
date: 2022年08月19日T00:18:59-05:00
summary:
GH-95822: Need _PyType_Lookup() in descriptor howto code equivalent. (GH-95967) (#96100)
files:
M Doc/howto/descriptor.rst
diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst
index f2e2f7ee68c2..6e7719e03f07 100644
--- a/Doc/howto/descriptor.rst
+++ b/Doc/howto/descriptor.rst
@@ -582,11 +582,18 @@ a pure Python equivalent:
 
 .. testcode::
 
+ def find_name_in_mro(cls, name, default):
+ "Emulate _PyType_Lookup() in Objects/typeobject.c"
+ for base in cls.__mro__:
+ if name in vars(base):
+ return vars(base)[name]
+ return default
+
 def object_getattribute(obj, name):
 "Emulate PyObject_GenericGetAttr() in Objects/object.c"
 null = object()
 objtype = type(obj)
- cls_var = getattr(objtype, name, null)
+ cls_var = find_name_in_mro(objtype, name, null)
 descr_get = getattr(type(cls_var), '__get__', null)
 if descr_get is not null:
 if (hasattr(type(cls_var), '__set__')
@@ -663,6 +670,15 @@ a pure Python equivalent:
 def __getattr__(self, name):
 return ('getattr_hook', self, name)
 
+ class D1:
+ def __get__(self, obj, objtype=None):
+ return type(self), obj, objtype
+
+ class U1:
+ x = D1()
+
+ class U2(U1):
+ pass
 
 .. doctest::
 :hide:
@@ -696,6 +712,10 @@ a pure Python equivalent:
 >>> b.g == b['g'] == ('getattr_hook', b, 'g')
 True
 
+ >>> u2 = U2()
+ >>> object_getattribute(u2, 'x') == u2.x == (D1, u2, U2)
+ True
+
 Note, there is no :meth:`__getattr__` hook in the :meth:`__getattribute__`
 code. That is why calling :meth:`__getattribute__` directly or with
 ``super().__getattribute__`` will bypass :meth:`__getattr__` entirely.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /