灵活的设计以允许插件

问题描述

我正在开发一个使用 stevedore 作为插件的遗传算法包。我提供了 GA 的每个组件(种群、交叉、变异、适应度等)的认实现,但目标是允许用户使用插件来替换任何或所有认组件。

我有一个 geneticAlgorithm 类来协调插件并执行算法的每一步。每个方法调用正确的一个或多个插件并返回结果。例如,mutate 方法如下所示:

    def mutate(self,**kwargs):
        """Mutates population

            Keyword Args:
                population (np.ndarray): the population to mutate. Shape is n_individuals x n_chromosomes.
                mutation_rate (float): decimal value from 0 to 1,default .05

            Returns:
                np.ndarray of same shape and dtype as population

        """
        if mgr := self.driver_managers.get('mutate'):
            return mgr.driver.mutate(**kwargs)
        population = kwargs['population']
        for ext in self.extension_managers['mutate'].extensions:
            try:
                kwargs['population'] = population
                population = ext.obj.mutate(**kwargs)
            except:
                continue
        return population

为了保持灵活性,我不想在方法签名中包含插件实现可能不会使用的参数。然而,这使得记录 GA 类变得困难。我包含了一个 Keyword Args 部分,但这不是 mkdocs/mkdocstrings 识别的标准部分,因此它没有正确显示在已发布的文档中。

这让我想到了两个问题:

(1) 指定插件可能不使用的参数(这里是population和mutation_rate)然后还使用**kwargs来允许额外的关键字参数是一种好习惯,还是最好保持原样只有 **kwargs

(2) 在使用 Google 风格的文档字符串时记录 **kwargs 的最佳实践是什么?

预先感谢您的想法和建议!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)