From 8d9be42a2821ffed248db455c4976a079e2fe2cb Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 13 Jan 2005 21:18:17 +0000 Subject: [PATCH] Patch from Prabhu Ramachandran to make introspection of lazily evaluated objects not create the final object. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31352 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/wx/py/introspect.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/wxPython/wx/py/introspect.py b/wxPython/wx/py/introspect.py index ebb756999e..5b2702277a 100644 --- a/wxPython/wx/py/introspect.py +++ b/wxPython/wx/py/introspect.py @@ -39,18 +39,29 @@ def getAttributeNames(object, includeMagic=1, includeSingle=1, attributes = [] dict = {} if not hasattrAlwaysReturnsTrue(object): - # Add some attributes that don't always get picked up. If - # they don't apply, they'll get filtered out at the end. - attributes += ['__bases__', '__class__', '__dict__', '__name__', - 'func_closure', 'func_code', 'func_defaults', - 'func_dict', 'func_doc', 'func_globals', 'func_name'] + # Add some attributes that don't always get picked up. + special_attrs = ['__bases__', '__class__', '__dict__', '__name__', + 'func_closure', 'func_code', 'func_defaults', + 'func_dict', 'func_doc', 'func_globals', 'func_name'] + attributes += [attr for attr in special_attrs \ + if hasattr(object, attr)] if includeMagic: try: attributes += object._getAttributeNames() except: pass # Get all attribute names. attrdict = getAllAttributeNames(object) - for attrlist in attrdict.values(): - attributes += attrlist + # Store the object's dir. + object_dir = dir(object) + for (str_obj, technique, count), attrlist in attrdict.items(): + # This complexity is necessary to avoid accessing all the + # attributes of the object. This is very handy for objects + # whose attributes are lazily evaluated. + if str(object) == str_obj and technique == 'dir': + attributes += attrlist + else: + attributes += [attr for attr in attrlist \ + if attr not in object_dir and hasattr(object, attr)] + # Remove duplicates from the attribute list. for item in attributes: dict[item] = None @@ -65,9 +76,6 @@ def getAttributeNames(object, includeMagic=1, includeSingle=1, or item[1]=='_', attributes) if not includeDouble: attributes = filter(lambda item: item[:2]!='__', attributes) - # Make sure we haven't picked up any bogus attributes somehow. - attributes = [attribute for attribute in attributes \ - if hasattr(object, attribute)] return attributes def hasattrAlwaysReturnsTrue(object): -- 2.47.2