如何通过程序获取kdb函数的秩并校验秩范围抛出错误
Kdb函数秩的验证与错误抛出实现
需求说明
在测试验证场景中,需通过程序获取kdb函数的秩,判断其是否等于指定值(此处为2)。若函数秩小于或大于2,直接抛出错误。
示例函数及秩的表现
以下是秩为2的函数func:{x+y*10}的运行示例:
q)func: {x+y*10} // 传入2个参数(匹配秩2),执行正常 q)func [2;4] 42 // 传入1个参数,返回偏应用函数(未触发错误) q)func [2;] {x+y*10}[2;] // 传入3个参数,触发原生秩错误 q)func [2;3;4] 'rank [0] func [2;3;4]
实现方案
通过kdb内置的value函数获取函数的元数据,提取参数列表长度得到函数的秩,再与预期值对比,不一致则抛出错误。
验证函数实现
checkRank:{[targetFunc;expectedRank] // 获取函数的参数列表,计算长度得到实际秩 actualRank:count third value targetFunc; // 对比实际秩与预期秩,不一致则抛错 if[actualRank <> expectedRank; `rankMismatch throw "函数预期秩为", string expectedRank, ",实际为", string actualRank ] }
使用示例
// 验证秩为2的函数,无输出(验证通过) q)checkRank[func;2] // 验证秩为1的函数,触发错误 q)singleArgFunc:{x*20} q)checkRank[singleArgFunc;2] 'rankMismatch [0] checkRank[singleArgFunc;2] ^ "函数预期秩为2,实际为1" // 验证秩为3的函数,触发错误 q)tripleArgFunc:{x+y+z} q)checkRank[tripleArgFunc;2] 'rankMismatch [0] checkRank[tripleArgFunc;2] ^ "函数预期秩为2,实际为3"
说明
value targetFunc返回函数的内部表示,其中第三个元素为函数的参数名列表count third value targetFunc直接得到参数个数,即函数的秩- 自定义错误类型
rankMismatch便于区分原生秩错误,也可根据需求调整为原生rank错误
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

