我有一个类,可以用不同的参数组合来构建,但是我有一个必需的参数列表。以下是我当前的检查方式:
# 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”部分,从而使代码更通用?我不想这么做有什么原因吗?在
这应该可以做到:
我倾向于同意其他评论和答案,即最好使用这些常规参数,并允许在传递错误的参数时导致Python错误发生。在
但是,有时您可能需要执行一些特殊的验证过程。我不认为这是一个好的设计选择,但也许这是可能的。在
在这种情况下,我想创建一个包含验证逻辑的decorator:
然后创建一个修饰的helper函数,该函数构造应用了验证逻辑的类。在
^{pr2}$现在,如果您调用
my_class_maker(...)
,当修饰函数检查关键字参数时,将执行验证逻辑。如果所有需要的参数都在那里,那么您只需取回创建的实例。在这有一个额外的好处:验证逻辑是模块化的,并且与类本身的逻辑保持分离,因为验证的思想可能应用于许多不相关的类,每个类都没有真正的理由关心为什么类的外部用户需要验证。在
您甚至可以扩展我编写的decorator并允许将callable传递到decorator maker,然后该callable可以封装验证行为,以便在找不到参数时执行。那么,即使是特定的验证行为也不必修复。在
如果他们是必需的,让他们成为常规的论据:
相关问题 更多 >
编程相关推荐