正在动态位置加载 class 未知名称

Loading a class of unknown name in a dynamic location

目前正在解压文件到操作系统的temp目录下。其中一个文件是 Python 文件,其中包含我需要处理的 class。 Python 的文件已知,但文件中 class 的名称未知。但可以安全地假设,只有一个 class,并且 class 是另一个 class 的子class。

我尝试使用 importlib,但我无法获得 class 的句柄。

到目前为止我尝试了:

# Assume 
# module_name contains the name of the class and     -> "MyClass"
# path_module contains the path to the python file   -> "../Module.py"
spec = spec_from_file_location(module_name, path_module)
module = module_from_spec(spec)
for pair in inspect.getmembers(module):
    print(f"{pair[1]} is class: {inspect.isclass(pair[1])}")

当我遍历模块的成员时,none 被打印为 class。

我的 class 在这种情况下称为 BasicModel 并且控制台上的输出如下所示:

BasicModel is class: False

正确的做法是什么?

编辑:

由于请求了文件的内容,现在开始:

class BasicModel(Sequential):

    def __init__(self, class_count: int, input_shape: tuple):
        Sequential.__init__(self)
        self.add(Input(shape=input_shape))
        self.add(Flatten())
        self.add(Dense(128, activation=nn.relu))
        self.add(Dense(128, activation=nn.relu))
        self.add(Dense(class_count, activation=nn.softmax))

使用dir()获取文件的属性,使用inspect检查属性是否为class。如果是这样,您可以创建一个对象。

假设您的文件路径是 /tmp/mysterious 您可以这样做:

import importlib
import inspect
from pathlib import Path
import sys

path_pyfile = Path('/tmp/mysterious.py')
sys.path.append(str(path_pyfile.parent))
mysterious = importlib.import_module(path_pyfile.stem)

for name_local in dir(mysterious):
    if inspect.isclass(getattr(mysterious, name_local)):
        print(f'{name_local} is a class')
        MysteriousClass = getattr(mysterious, name_local)
        mysterious_object = MysteriousClass()