def test_descend_classes_and_funcs(): # create module hierarchy a = ModuleType('a') a.b = ModuleType('a.b') # populate with classes a.A = type('A', (), {}) a.A.__module__ = a.__name__ a.b.B = type('B', (), {}) a.b.B.__module__ = a.b.__name__ # create a loop to check if that gets caught a.b.a = a assert {a.A, a.b.B} == set(descend_classes_and_funcs(a, 'a'))