Created
March 22, 2015 04:39
-
-
Save bencharb/3d22d496c90516797e1d to your computer and use it in GitHub Desktop.
get object members
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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