Pattern.text.en库conjugate函数首次调用触发StopIteration错误求助
问题
使用conjugate(oldWord, tense=this_tense, person=person, number=number)转换动词过去式时,首次调用总会触发StopIteration错误,但二次调用相同参数可正常运行。处理500个句子时存在该问题,需要彻底解决以实现生产环境整洁代码,期望正常获取动词过去式。
错误详情:
Traceback (most recent call last): File "C:\Users\USER\PycharmProjects\zikit1\pattern\text\__init__.py", line 609, in _read raise StopIteration StopIteration The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\USER\PycharmProjects\zikit1\main.py", line 130, in <module> tmp = change_tense.change_tense(short_res[i], 'past') File "C:\Users\USER\PycharmProjects\zikit1\change_tense.py", line 124, in change_tense x1 = conjugate(oldWord, tense=this_tense, person=person, number=number) File "C:\Users\USER\PycharmProjects\zikit1\pattern\text\__init__.py", line 2208, in conjugate b = self.lemma(verb, parse=kwargs.get("parse", True)) File "C:\Users\USER\PycharmProjects\zikit1\pattern\text\__init__.py", line 2172, in lemma self.load() File "C:\Users\USER\PycharmProjects\zikit1\pattern\text\__init__.py", line 2127, in load for v in _read(self._path): RuntimeError: generator raised StopIteration
可行解决方案
- 预加载词库:在程序启动阶段,提前调用一次
conjugate(比如用conjugate("run", tense="past")这类无业务影响的调用),触发词库加载流程。后续正式业务调用时,词库已完成加载,不会再触发生成器异常。 - 修复pattern库的
_read函数:问题根源是Python 3.7+不允许生成器内部主动抛出StopIteration,会直接转为RuntimeError。找到pattern/text/__init__.py中_read函数的raise StopIteration代码,替换为return,让生成器自然结束。 - 添加异常捕获重试:封装
conjugate函数,首次调用失败时自动重试一次,无需修改库源码:
业务代码中直接使用def safe_conjugate(oldWord, **kwargs): try: return conjugate(oldWord, **kwargs) except RuntimeError: return conjugate(oldWord, **kwargs)safe_conjugate替代原函数即可。 - 升级或替换库:检查pattern库是否有新版本,新版本可能已修复该兼容问题;若无法升级,可替换为
pyinflect、nltk等适配Python 3.7+的动词变位库。
内容的提问来源于stack exchange,提问作者Tomer Vazana
相关产品推荐
相关产品推荐

