检查Python类中所需参数的最佳方法

2024-09-27 17:34:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,可以用不同的参数组合来构建,但是我有一个必需的参数列表。以下是我当前的检查方式:

    # check for the required arguments
    rqrd_args = ['a', 'b', 'c']  # required arguments
    mssing_args = set(rqrd_args)-set(kwargs.keys())
    if mssing_args:
        error_lines = ['The following required arguments are missing:']
        error_lines.extend(['\t%s'%x for x in mssing_args])
        sys.exit('\n'.join(error_lines))

    # pull from kwargs
    self.a = kwargs['a']
    self.b = kwargs['b']
    self.c = kwargs['c']

我经常重复使用这个代码。我的问题是,我是否可以用一个循环来替换“#pull from kwargs”部分,从而使代码更通用?我不想这么做有什么原因吗?在


Tags: 代码fromselffor参数requiredargserror
3条回答

这应该可以做到:

for attr_name in rqrd_args:
    setattr(self, attr_name, kwargs[attr_name])

我倾向于同意其他评论和答案,即最好使用这些常规参数,并允许在传递错误的参数时导致Python错误发生。在

但是,有时您可能需要执行一些特殊的验证过程。我不认为这是一个好的设计选择,但也许这是可能的。在

在这种情况下,我想创建一个包含验证逻辑的decorator:

def arg_validator(*arg_names):
    from functools import wraps
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for arg in arg_names:
                if arg not in kwargs:
                    # Do some handling here for missing arg
            return func(*args, **kwargs)
        return wrapper
    return decorator

然后创建一个修饰的helper函数,该函数构造应用了验证逻辑的类。在

^{pr2}$

现在,如果您调用my_class_maker(...),当修饰函数检查关键字参数时,将执行验证逻辑。如果所有需要的参数都在那里,那么您只需取回创建的实例。在

这有一个额外的好处:验证逻辑是模块化的,并且与类本身的逻辑保持分离,因为验证的思想可能应用于许多不相关的类,每个类都没有真正的理由关心为什么类的外部用户需要验证。在

您甚至可以扩展我编写的decorator并允许将callable传递到decorator maker,然后该callable可以封装验证行为,以便在找不到参数时执行。那么,即使是特定的验证行为也不必修复。在

如果他们是必需的,让他们成为常规的论据:

def __init__(a, b, c, **kwargs):
    self.a = a
    self.b = b
    self.c = c
    # ... then the rest in kwargs

相关问题 更多 >

    热门问题