我正在开发一个暴露很多功能的 class
.
所有这些函数都接受可变数量的输入参数,这些参数需要通过某些标准进行验证,并且有时会进行转换 . 验证例程不是计算密集型的,但有点长(大约30行代码) .
为了避免反复重复模式,无意义地增加了我的代码的大小,我决定将它实现为静态方法,并在需要验证时在函数内部调用它 .
下面是我所描述的一个小例子:
class MyClass():
def function_a(self, var1, var2):
var1 = MyClass._validate_input_a(var1, 'var1')
var2 = MyClass._validate_input_a(var2, 'var2')
# ...
def function_b(self, var):
var = MyClass._validate_input_a(var, 'var')
# ...
def function_a(self, var1, var2, var3):
var1 = MyClass._validate_input_a(var1, 'var1')
var2 = MyClass._validate_input_b(var2, 'var2')
var3 = MyClass._validate_input_b(var3, 'var2')
# ...
@staticmethod
def _validate_input_a(input, parameter_name:str) -> bool:
if input is None:
raise ValueError('The "%s" parameter is invalid.' % parameter_name)
if not isinstance(input, list):
raise TypeError('The "%s" parameter must be a list.' % parameter_name)
# many other checks...
input = transform(input
return input
@staticmethod
def _validate_input_b(input, parameter_name:str) -> bool:
# same as a, but with different checks...
这就像一个魅力,但在我看来,代码失去了一点用户友好性,我的课程变得有点难以调试因为 .
如果发生验证错误,我必须查看堆栈跟踪以查看问题的根源,同时将错误直接引入函数体 .
在这种情况下,输入验证的最佳做法是什么?你能建议我一个更好的方法吗?也许描述符是一个可行的选择?