PYKX访问属性后无法更新Python属性的异常问题咨询
问题原因:pykx访问Q变量的属性缓存机制
这是pykx的属性访问逻辑导致的:
- 当你第一次通过
pykx.q.my_handle这种属性方式访问Q变量时,pykx会把Q内存中的值转换成对应的Python对象,然后缓存这个对象的引用。 - 后续再直接访问
pykx.q.my_handle时,pykx不会重新去Q内存里读取最新值,而是直接返回之前缓存的旧对象。 - 但
pykx.q("string .my_handle")是直接向Q发送查询指令,会实时读取Q内存中的当前值,所以能拿到更新后的内容。
问题重现代码
import pykx old=":host:Port:user:old" pykx.q.my_handle=old # 第一次访问触发缓存 print(f"my handled: {pykx.q.my_handle}") new=":host:Port:user:new" pykx.q.my_handle=new # 读取缓存的旧值 print(pykx.q.my_handle) # 实时读取Q内存的新值 print(pykx.q("string .my_handle"))
解决方法
实时查询(推荐):
放弃属性访问方式,每次通过Q表达式直接查询最新值:# 实时获取Q内存中的最新值 print(pykx.q('.my_handle')) # 转成字符串输出 print(pykx.q('string .my_handle'))手动清空缓存:
如果一定要用属性访问,可以删除pykx的缓存后再读取:import pykx old=":host:Port:user:old" pykx.q.my_handle=old print(f"my handled: {pykx.q.my_handle}") new=":host:Port:user:new" pykx.q.my_handle=new # 删除缓存的属性引用 del pykx.q.__dict__['my_handle'] # 重新访问会拉取Q内存中的最新值 print(pykx.q.my_handle)
内容的提问来源于stack exchange,提问作者nachofest
相关产品推荐
相关产品推荐

