Mic*_*x2a 6 python validation assert
最近,我一直在添加asserts几乎所有我用来验证每个输入的函数,作为穷人替代类型检查或防止自己在开发时意外输入格式错误的数据.例如,
def register_symbol(self, symbol, func, keypress=None):
assert(isinstance(symbol, basestring))
assert(len(symbol) == 1)
assert(callable(func))
assert(keypress is None or type(keypress) is int)
self.symbols_map[symbol] = (func, keypress)
return
Run Code Online (Sandbox Code Playgroud)
但是,我担心这与鸭子打字的想法背道而驰,而且我可能会过于过分或不必要地限制自己.你有没有太多的断言陈述?什么时候停下来?
我只使用asserts,如果它们提供的错误信息比我得到的错误消息好得多.你的第三个断言
assert(callable(func))
Run Code Online (Sandbox Code Playgroud)
可能是这样一个断言的一个例子 - 如果func不可调用,你将在一个完全不同的代码行上得到一个错误消息,而不是实际的错误,并且可能不明显的是不可调用的对象如何结束self.symbols_map.我写"可能",因为这取决于你的其余代码 - 如果这是唯一self.symbols_map更新的地方,断言也可能是不必要的.
第一个和最后一个断言肯定是反对鸭子打字的想法,第二个断言是多余的.如果symbol不是长度为1的字符串,那么无论如何都可能self.symbols_map[symbol]会提高KeyError,所以不需要断言.
最后一个断言也是错误的 - type(keypress)不可能None,并且应该进行类型检查isinstance().可能有非常专业的应用程序,您不能允许子类型,但应该执行检查type(x) is int而不是type(x) == int.检查None应该通过x is None而不是通过type(x) is NoneType.
您应该编写一组良好的单元测试 - 它们比断言更有用,并且可能使您的几乎所有断言都变得多余.