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
This commit is contained in:
Robin Dunn
2005-01-13 21:18:17 +00:00
parent b81de788b4
commit 8d9be42a28

View File

@@ -39,18 +39,29 @@ def getAttributeNames(object, includeMagic=1, includeSingle=1,
attributes = [] attributes = []
dict = {} dict = {}
if not hasattrAlwaysReturnsTrue(object): if not hasattrAlwaysReturnsTrue(object):
# Add some attributes that don't always get picked up. If # Add some attributes that don't always get picked up.
# they don't apply, they'll get filtered out at the end. special_attrs = ['__bases__', '__class__', '__dict__', '__name__',
attributes += ['__bases__', '__class__', '__dict__', '__name__', 'func_closure', 'func_code', 'func_defaults',
'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
'func_dict', 'func_doc', 'func_globals', 'func_name'] attributes += [attr for attr in special_attrs \
if hasattr(object, attr)]
if includeMagic: if includeMagic:
try: attributes += object._getAttributeNames() try: attributes += object._getAttributeNames()
except: pass except: pass
# Get all attribute names. # Get all attribute names.
attrdict = getAllAttributeNames(object) attrdict = getAllAttributeNames(object)
for attrlist in attrdict.values(): # Store the object's dir.
attributes += attrlist 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. # Remove duplicates from the attribute list.
for item in attributes: for item in attributes:
dict[item] = None dict[item] = None
@@ -65,9 +76,6 @@ def getAttributeNames(object, includeMagic=1, includeSingle=1,
or item[1]=='_', attributes) or item[1]=='_', attributes)
if not includeDouble: if not includeDouble:
attributes = filter(lambda item: item[:2]!='__', attributes) 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 return attributes
def hasattrAlwaysReturnsTrue(object): def hasattrAlwaysReturnsTrue(object):