-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcount the number of classes and functions.py
90 lines (75 loc) · 2.59 KB
/
count the number of classes and functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import pkgutil
import importlib
import inspect
def find_all_submodules(package_name):
"""
Return a list of module objects (including sub-packages)
under the given top-level package name, e.g. "Chromatix".
"""
modules = []
visited = set()
def walk(name):
if name in visited:
return
visited.add(name)
# Import the module or package
pkg = importlib.import_module(name)
modules.append(pkg)
# If it's a package, iterate its contents
if hasattr(pkg, '__path__'): # indicates a package
for info in pkgutil.iter_modules(pkg.__path__, prefix=name+'.'):
walk(info.name)
# Start recursion from the root package
walk(package_name)
return modules
def count_classes_and_functions_per_module(modules):
"""
Given a list of imported module objects, return a dict with:
{
"some_pkg": {
"is_package": True,
"classes": X,
"functions": Y
},
"some_pkg.submodule": {
"is_package": False,
"classes": ...,
"functions": ...
},
...
}
"""
results = {}
for mod in modules:
classes = 0
functions = 0
# Determine if 'mod' is a package
is_package = hasattr(mod, '__path__')
# Inspect all attributes in the module
for name, obj in inspect.getmembers(mod):
if inspect.isclass(obj) and obj.__module__ == mod.__name__:
classes += 1
elif inspect.isfunction(obj) and obj.__module__ == mod.__name__:
functions += 1
results[mod.__name__] = {
"is_package": is_package,
"classes": classes,
"functions": functions
}
return results
if __name__ == "__main__":
# Example: Analyze the 'Chromatix' library (replace with the real import name).
package_name = "chromatix"
# 1. Discover all modules & packages
modules = find_all_submodules(package_name)
# 2. Count classes & functions per module
module_counts = count_classes_and_functions_per_module(modules)
# 3. Print or process the results
# For instance, show each module, how many classes, how many functions,
# and whether it is a package.
for mod_name, info in sorted(module_counts.items()):
print(f"Module: {mod_name}")
print(f" Is Package: {info['is_package']}")
print(f" Classes: {info['classes']}")
print(f" Functions: {info['functions']}")
print()