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:
		@@ -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):
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user