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