Commit 93fe5642 authored by Guido van Rossum's avatar Guido van Rossum

_slotnames(): this is a fairly expensive calculation. Cache the

outcome as __slotnames__ on the class.  (Like __slots__, it's not safe
to ask for this as an attribute -- you must look for it in the
specific class's __dict__.  But it must be set using attribute
notation, because __dict__ is a read-only proxy.)
parent 2de97d39
...@@ -876,13 +876,30 @@ def _slotnames(cls): ...@@ -876,13 +876,30 @@ def _slotnames(cls):
__slots__ attribute to misrepresent their slots after the class is __slots__ attribute to misrepresent their slots after the class is
defined.) defined.)
""" """
if not hasattr(cls, "__slots__"):
return [] # Get the value from a cache in the class if possible
names = cls.__dict__.get("__slotnames__")
if names is not None:
return names
# Not cached -- calculate the value
names = [] names = []
for c in cls.__mro__: if not hasattr(cls, "__slots__"):
if "__slots__" in c.__dict__: # This class has no slots
names += [name for name in c.__dict__["__slots__"] pass
if name not in ("__dict__", "__weakref__")] else:
# Slots found -- gather slot names from all base classes
for c in cls.__mro__:
if "__slots__" in c.__dict__:
names += [name for name in c.__dict__["__slots__"]
if name not in ("__dict__", "__weakref__")]
# Cache the outcome in the class if at all possible
try:
cls.__slotnames__ = names
except:
pass # But don't die if we can't
return names return names
def _keep_alive(x, memo): def _keep_alive(x, memo):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment