使用tree-sitter-languages 0.25.1的get_parser时遇TypeError错误
问题详情
在使用tree-sitter-languages 0.25.1的get_parser("javascript")时触发以下错误:
TypeError: __init__() takes exactly 1 argument (2 given)
相关代码片段:
from tree_sitter_languages import get_parser as ts_get_parser class JavaScriptExtractor(BaseExtractor): _parser = None @classmethod def _init_parser(cls): print("Global get_parser:", globals().get("ts_get_parser")) print("<br>") print("cls dict:", cls.__dict__.keys()) if cls._parser is None: cls._parser = ts_get_parser("javascript") print(cls._parser) # 预期输出Parser对象
调用ts_get_parser("JavaScript")时触发错误,已完成的排查:
- 卸载并重新安装tree-sitter-languages
- 编写独立最小测试脚本,排除其他代码干扰,问题依旧存在
更新信息:同时安装了tree-sitter包,将其从0.25.1回退到0.21.3后问题解决,推测是版本冲突,但无法满足需使用tree-sitter 0.25.1的场景。
问题原因
tree-sitter-languages 0.25.1依赖特定版本的tree-sitter,当手动安装的tree-sitter版本(0.25.1)与tree-sitter-languages内部预期的版本不匹配时,会出现构造函数参数不兼容的问题——新版本的tree-sitter Parser类构造函数签名发生了变化,而tree-sitter-languages仍在使用旧的调用方式。
解决方案
1. 使用tree-sitter-languages自带的tree-sitter版本
卸载当前手动安装的tree-sitter包,让tree-sitter-languages使用其依赖的对应版本:
pip uninstall tree-sitter pip install --force-reinstall tree-sitter-languages==0.25.1
此方法能确保两个包版本完全兼容,直接解决参数不匹配的问题。
2. 指定兼容的tree-sitter版本
如果必须使用tree-sitter 0.25.x系列,可查看tree-sitter-languages 0.25.1的setup.py或PyPI依赖声明,找到其适配的tree-sitter版本后安装对应版本。例如若tree-sitter-languages 0.25.1依赖tree-sitter~=0.21.0,需在功能需求和版本兼容间做取舍,或等待tree-sitter-languages更新适配高版本tree-sitter。
3. 直接使用tree-sitter手动配置
放弃tree-sitter-languages,直接用tree-sitter包手动下载并加载JavaScript语法,完全控制版本避免冲突:
from tree_sitter import Parser, Language # 先确保已下载tree-sitter-javascript语法,或通过Language.build生成 Language.build_library( 'build/my-languages.so', ['vendor/tree-sitter-javascript'] ) JS_LANGUAGE = Language('build/my-languages.so', 'javascript') parser = Parser() parser.set_language(JS_LANGUAGE)
此方法需要手动管理语法库,但能彻底规避版本依赖问题。
内容的提问来源于stack exchange,提问作者Chris E

