Skip to content

Instantly share code, notes, and snippets.

@bencharb
Created March 22, 2015 04:39
Show Gist options
  • Save bencharb/3d22d496c90516797e1d to your computer and use it in GitHub Desktop.
Save bencharb/3d22d496c90516797e1d to your computer and use it in GitHub Desktop.
get object members
#!/bin/python
import inspect
import itertools
DEFAULT_OBJECT_ATTRS = set(dir(type('dummy', (object,), {})))
FILTER_VALUE_FUNCTIONS = inspect.isroutine, inspect.ismethod
FILTER_NAME_FUNCTIONS = [lambda n: n in DEFAULT_OBJECT_ATTRS]
def get_object_members(cls_or_instance, keep_sunders=False):
""" List non-callable and non-built-in members of class or instance """
valid = []
filter_value_functions = FILTER_VALUE_FUNCTIONS
if keep_sunders:
filter_name_functions = FILTER_NAME_FUNCTIONS
else:
filter_name_functions = list(FILTER_NAME_FUNCTIONS) + [lambda x: x.startswith('_')]
for name, value in inspect.getmembers(cls_or_instance):
if any((func(value) for func in filter_value_functions )) or any((func(name) for func in filter_name_functions)):
continue
else:
yield name, value
def test_get_object_members():
class SomeObject(object):
a = 1
b = 2
_c = 3
__d = 4
class inner(object):
pass
def f1(self): pass
def _f2(self): pass
def _f3(self): pass
@classmethod
def fc1(self): pass
@classmethod
def _fc2(self): pass
@classmethod
def __fc3(self): pass
@property
def p1(self): pass
@property
def _p2(self): pass
@property
def __p3(self): pass
expected_keep_sunders_false = {'a', 'b', 'inner', 'p1'}
expected_keep_sunders_true = {'_SomeObject__d', '_SomeObject__p3', '_c', '_p2', 'a', 'b', 'inner', 'p1'}
try:
not_keep_sunders = list(get_object_members(SomeObject, keep_sunders=False))
keep_sunders = list(get_object_members(SomeObject, keep_sunders=True))
assert({name for name, value in not_keep_sunders} == expected_keep_sunders_false)
assert({name for name, value in keep_sunders} == expected_keep_sunders_true)
except AssertionError:
print 'test failed'
raise
else:
print 'test passed'
test_get_object_members()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment