Skip to content

fix(mootdx): 规避 0.11.7 BESTIP.HQ 空串导致的 ValueError#7

Open
ericheroster wants to merge 1 commit into
simonlin1212:mainfrom
ericheroster:fix/mootdx-bestip-empty-string
Open

fix(mootdx): 规避 0.11.7 BESTIP.HQ 空串导致的 ValueError#7
ericheroster wants to merge 1 commit into
simonlin1212:mainfrom
ericheroster:fix/mootdx-bestip-empty-string

Conversation

@ericheroster
Copy link
Copy Markdown

问题

Quotes.factory(market='std') 裸调用在 mootdx 0.11.7 下会触发:

ValueError: not enough values to unpack (expected 2, got 0)
  at mootdx/quotes.py:154

按 SKILL.md V3.0 Prerequisites 安装 pip install mootdx==0.11.7 后,Layer 1.1 / 6.1 / 6.2 / 7.2 共 4 处 mootdx 调用全部受影响。

根因

mootdx 0.11.7 的 ~/.mootdx/config.jsonBESTIP.HQ 初始值是空字符串 "",而不是缺失键或 nullquotes.py:151 的逻辑:

default = config.get('SERVER').get('HQ')[0][1:]
self.server = config.get('BESTIP').get('HQ', default)   # ← 这里 default 永远拿不到

dict.get(key, default) 仅在键缺失时返回 defaultBESTIP.HQ存在的空串,所以 self.server = "",下一行 ip, port = self.server 拆包失败。

另外两个补充发现:

  1. bestip=True 自动测速也无法修复 —— 测速跑完后写进 BESTIP.HQ 的是不在 SERVER.HQ 列表里的 IP(如 218.6.170.47),而且不通;
  2. 38 个内置服务器并非都可达 —— 在我本地 ISP 实测仅 14 / 38 可用(武汉/上海双线/广州双线大部分通,深圳双线 6/8 个超时)。必须 fallback 探测。

改动

仅修改 SKILL.md

  1. 在 Prerequisites 末尾新增 mootdx 客户端(必读,规避 0.11.7 已知 bug) 章节,包含:
    • bug 触发条件、根因说明
    • 10 个实测可达服务器列表(按延迟排序,2026-05 验证)
    • _probe() TCP 握手探测函数
    • tdx_client(market='std') helper:顺序探测 fallback,全不通则 RuntimeError
  2. 将 4 处 client = Quotes.factory(market='std') 调用替换为 client = tdx_client()
    • Layer 1.1(K线 / 五档 / 逐笔)
    • Layer 6.1(财务快照)
    • Layer 6.2(F10 公司资料)
    • Layer 7.2(F10 公告摘要)

不动 README、CHANGELOG。

验证

将本地 ~/.mootdx/config.jsonBESTIP.HQ 还原为 "" 模拟全新安装环境,然后跑 SKILL.md 中的 helper:

调用点 结果
Layer 1.1 client.bars OK,server=('119.97.185.59', 7709)
Layer 1.1 client.quotes OK
Layer 6.1 client.finance OK
Layer 6.2 / 7.2 client.F10 OK,返回 14626 字符

备选方案讨论

也考虑过其它修法:

  • 每处直接传 server:4 处都写 Quotes.factory(market='std', server=('119.97.185.59', 7709))。优点最简单,缺点服务器挂了要 4 处手改。
  • 仅加 Prerequisites 提示让用户改 config.json:风险是用户漏读 / 不同环境 BESTIP.HQ 已被破坏到不同状态。
  • 不动 SKILL.md,去 mootdx 上游修:上游修复要等版本发布;这里作为 Skill 文档先 ship 一个对调用者更友好的 workaround,更稳。

选了 tdx_client() helper 方案 —— 单点维护(升级 mootdx 后 helper 内部就只剩"探测 fallback"价值,可保留为容灾),调用方零认知负担。

不影响

  • README / CHANGELOG / 其它非 mootdx 端点的代码未改
  • 不引入新依赖(socket 是标准库)
  • _TDX_SERVERS 是从仓库 ~/.mootdx/config.json 的内置 SERVER.HQ 子集中挑出来的实测可达项,无新数据源

注:本 PR 不试图修复 mootdx 上游 bug 本身(那需要修 quotes.py:151 的 default fallback 逻辑,应由 mootdx 维护者决定)。这里只是把 Skill 用户从这个坑里救出来。

Quotes.factory(market='std') 裸调用在 0.11.7 下抛 ValueError: not enough values to unpack (expected 2, got 0)。根因是 config.json 中 BESTIP.HQ 初始值是空字符串 (非缺失键),quotes.py:151 的 dict.get(key, default) 取不到 default,self.server = '' 拆包失败。bestip=True 自动测速也无法修复 (测速结果写不回 BESTIP.HQ)。

在 Prerequisites 增加 tdx_client() helper:含 10 个实测可达服务器列表 + TCP 握手探测 fallback,并将 SKILL.md 中 4 处 Quotes.factory(market='std') 调用替换为 tdx_client()。

已端到端验证:将 ~/.mootdx/config.json 的 BESTIP.HQ 还原为 '' 模拟全新环境后,4 个调用点 (bars / quotes / finance / F10) 均能正常返回数据。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant