如何在Python中动态重载函数?

阿芙赛

我正在尝试创建一个过程,以动态监视jupyter笔记本,在修改时对其进行编译,然后将其导入到我的当前文件中,但是我似乎无法执行更新的代码。它仅执行已加载的第一个版本。

有一个名为的文件producer.py反复调用此函数:

import fs.fs_util as fs_util

while(True):
    fs_util.update_feature_list()

fs_util.py执行以下操作:

from fs.feature import Feature
import inspect
from importlib import reload
import os 


def is_subclass_of_feature(o):
    return inspect.isclass(o) and issubclass(o, Feature) and o is not Feature

def get_instances_of_features(name):
    module = __import__(COMPILED_MODULE, fromlist=[name])
    module = reload(module)
    feature_members = getattr(module, name)
    all_features = inspect.getmembers(feature_members, predicate=is_subclass_of_feature)
    return [f[1]() for f in all_features]

该函数的调用者:

def update_feature_list(name):
    os.system("jupyter nbconvert --to script {}{} --output {}{}"
            .format(PATH + "/" + s3.OUTPUT_PATH, name + JUPYTER_EXTENSION, PATH + "/" + COMPILED_PATH, name))
    features = get_instances_of_features(name)
    for f in features:
        try:
            feature = f.create_feature()
        except Exception as e:
            print(e)

还有其他不相关的代码可以检查文件是否已被修改等。

我可以说文件正在正确地重新加载,因为当我inspect.getsource(f.create_feature)在类上使用它时,它会显示更新的源代码,但是在执行过程中,它会返回旧值。我已经通过更改打印语句以及比较返回值来验证了这一点。

另外,对于更多上下文,我正在尝试导入文件:

from fs.feature import Feature


class SubFeature(Feature):

    def __init__(self):
        Feature.__init__(self)

    def create_feature(self):
        return "hello"

我想知道我做错了什么吗?

阿芙赛

所以我发现我做错了。

调用时,reload我正在重新加载我新导入的模块,我认为这是相当愚蠢的。正确的解决方案(以我为例)是从重新加载模块sys.modules,因此就像reload(sys.modules[COMPILED_MODULE + "." + name])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章