Snippet to get all local classes from a module I'm working on a project which due to the complexity of the business logic has had to pull out some classes to do computation related to some values in a database. To link the code and database, both when inserting and selecting, I need to get a list of all the class names contained within a single file. It works for me, but is this a sane approach?

import inspect

import my_module

my_module_class_names = [
    name for name, clazz in inspect.getmembers(my_module, inspect.isclass)
    if clazz.__module__ == my_module.__name__
]



inspect.getmembers(my_module, inspect.isclass) gets any class members of my_module.
if clazz.__module__ == my_module.__name__ ensures that classes imported into my_module are excluded from the list. This is the main reason I'm asking for a review - I only thought to include this clause because I had already imported other classes, and therefore the list had extraneous members.


Alternatively, from within my_module:

import inspect
import sys

def class_names() -&gt; List[str]:
    return [
        name for name, clazz in inspect.getmembers(sys.modules[__name__], inspect.isclass)
        if clazz.__module__ == sys.modules[__name__].__name__
    ]
I have already used similar code and it looks rather fine. Some nitpicks:


I’d name the variable cls to mimic the name often used as first parameters of @classmethods; or class_ as it is more common;
I’d store a list of classes intead of a list of names, this feels more directly usable (and names are still stored as cls.__name__ if need be);
sys.modules[__name__].__name__ should be just __name__.




Alternatively, since these classes seems related to each other, you may have an inheritance tree; or maybe a common base class. In this case, you could be even more specific using something such as:

[cls for _, cls in inspect.getmembers(my_module, inspect.isclass) if issubclass(cls, my_module.CommonBase)]


or

my_module.CommonBase.__subclasses__()


if there really is a single level of inheritance, but I wouldn't count much on it as it can break so easily.