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
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):