You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

qpython sendSync调用kdb函数传函数参数报QException异常

问题背景

KDB服务端预定义了以下两个函数:

q)t:{0N!x[`min]; 0N!x[`max];}
q).up.map:{[keyList; valueList] keyList!valueList}

服务端有强制限制:不允许直接将原生q字典()!()作为参数传入函数,所有字典参数必须通过.up.map方法构造。
在kdb原生交互环境中,调用t函数的正确写法为:

q)t[.up.map[`min`max;10 20]]
故障现象

需要通过qpython库的sendSync()方法实现上述调用逻辑,要求将.up.map[minmax;10 20]的执行结果作为入参传入t函数。常规传参方式调用时会抛出以下错误:

qpython.qtype.QException: b'['

查阅官方文档未找到对应场景的实现说明。

解决方法

核心思路是不要在Python侧构造字典再传输,因为qpython会自动把Python侧构造的字典序列化为原生q字典格式传输,直接触发服务端的参数校验规则,才会报解析错误。

报错根因:qpython序列化Python侧字典时,默认会转成原生q字典key!value的格式传输,正好命中服务端"禁止直接传原生字典"的校验规则,导致服务端解析参数时报错。把字典构造逻辑放到服务端通过.up.map实现,就可以完全绕开这个限制。

正确做法是把.up.map构造字典的逻辑放在KDB服务端执行,分两种常用场景:

  • 固定参数场景:直接把完整的q执行语句作为字符串传入sendSync()即可,示例代码:
from qpython import qconnection

# 初始化连接,替换为实际的服务地址、端口、鉴权信息
q_conn = qconnection.QConnection(host='127.0.0.1', port=5000, username='user', password='pwd')
q_conn.open()

# 直接发送完整执行语句,服务端自行完成字典构造和函数调用
call_result = q_conn.sendSync('t[.up.map[`min`max;10 20]]')

q_conn.close()
  • 动态传参场景:如果min、max值需要动态传入,不要直接拼接字符串(避免注入风险),可以用q函数占位的方式传动态值:
# 动态传入的业务值
dynamic_min = 10
dynamic_max = 20

# 第一个参数为q侧的匿名函数,后面跟顺序传入的动态参数
call_result = q_conn.sendSync('{t[.up.map[`min`max;x y]]}', dynamic_min, dynamic_max)

内容的提问来源于stack exchange,提问作者Utsav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:51:34