Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现一个简单的插件管理器类,该类能够注册需要不同参数的检查函数_Python_Oop - Fatal编程技术网

Python 实现一个简单的插件管理器类,该类能够注册需要不同参数的检查函数

Python 实现一个简单的插件管理器类,该类能够注册需要不同参数的检查函数,python,oop,Python,Oop,我想实现一个插件管理器类,该类能够注册多个检查函数,在dict中运行对虚拟机相关数据的检查,以验证是否满足特定条件(在检查函数中定义)。检查函数本身返回True(满足检查条件)或False。将哪些检查注册到manager类是由用户选择要运行的检查来定义的 我的问题是: 检查函数需要不同的参数(除了vm_data参数),例如,它们有时需要传入API连接对象以检查条件。 如何确保函数注册了所需的参数,因为用户可以选择要运行的检查?除了维护一堆条件句(这不是最好的主意)之外,还有其他方法来完成这项任务

我想实现一个插件管理器类,该类能够注册多个检查函数,在
dict
中运行对虚拟机相关数据的检查,以验证是否满足特定条件(在检查函数中定义)。检查函数本身返回
True
(满足检查条件)或
False
。将哪些检查注册到manager类是由用户选择要运行的检查来定义的

我的问题是: 检查函数需要不同的参数(除了
vm_data
参数),例如,它们有时需要传入API连接对象以检查条件。 如何确保函数注册了所需的参数,因为用户可以选择要运行的检查?除了维护一堆条件句(这不是最好的主意)之外,还有其他方法来完成这项任务吗?最后,我只想添加/删除检查函数,而不必处理条件块,这是不可维护的。也许还有另一种方法可以动态准备检查所需的参数

# just for simplicity - user input is a list
user_activated_checks = ['check_min_ram', 'check_vm_overrides']

manager = CheckManager()

if 'check_min_ram' in user_activated_checks:
   min_ram = 1024
   manager.register_check(check_min_ram, min_ram)

if 'check_vm_overrides' ...


欢迎来到SO!看看这本书。如果你能提供一份工作,那会很有帮助的。看看你是否需要更多的提示。这能回答你的问题吗?
def check_min_ram(vm_data, min_ram):
    """Check if VM has minimum of configured RAM"""
    # check-specific code


def check_vm_overrides(vm_data, cluster):
    """Check for VM configured cluster overrides."""
    # check-specifc code


class CheckManager:
    """Check plugin manager"""

    def __init__(self):
        self.registered_checks = []

    def _check_names(self):
        check_names = []
        for check in self.registered_checks:
            check_names.append(check[0].__name__)

        return check_names

    def register_check(self, func, *args, **kwargs):
        if func.__name__ not in self._check_names():
            self.registered_checks.append((func, args, kwargs))

    def run_checks(self):
        """
        Run all checks.
        Return True if one check is True.
        """
        if not self.registered_checks:
            return False

        for check in self.registered_checks:
            for func, args, kwargs in check:
                if func(*args, **kwargs):
                    return True