Python中执行help(yt_dlp.YoutubeDL)抛出KeyError异常问题
问题描述
在Python环境中使用yt_dlp库时,需查询yt_dlp.YoutubeDL类的所有可用方法与属性,执行help(yt_dlp.YoutubeDL)语句时运行失败,报错信息如下:
File "c:\Users\user\Desktop\youtube playlist downloader\playlist_dowloader.py", line 56, in <module> main() File "c:\Users\user\Desktop\youtube playlist downloader\playlist_dowloader.py", line 49, in main help(yt_dlp.YoutubeDL) File "C:\Python310\lib\_sitebuiltins.py", line 103, in __call__ return pydoc.help(*args, **kwds) File "C:\Python310\lib\pydoc.py", line 2006, in __call__ self.help(request) File "C:\Python310\lib\pydoc.py", line 2065, in help else: doc(request, 'Help on %s:', output=self._output) File "C:\Python310\lib\pydoc.py", line 1785, in doc pager(render_doc(thing, title, forceload)) File "C:\Python310\lib\pydoc.py", line 1778, in render_doc return title % desc + '\n\n' + renderer.document(object, name) File "C:\Python310\lib\pydoc.py", line 477, in document if _isclass(object): return self.docclass(*args) File "C:\Python310\lib\pydoc.py", line 1415, in docclass for name, kind, cls, value in classify_class_attrs(object) File "C:\Python310\lib\pydoc.py", line 300, in classify_class_attrs for (name, kind, cls, value) in inspect.classify_class_attrs(object): File "C:\Python310\lib\inspect.py", line 554, in classify_class_attrs homecls = getattr(get_obj, "__objclass__", homecls) File "C:\Python310\lib\site-packages\yt_dlp\utils.py", line 5333, in __getattr__ return self._dict[attr] KeyError: '__objclass__'
报错原因
yt_dlp部分自定义类的__getattr__方法实现存在兼容缺陷:Python内置inspect模块遍历类属性生成帮助文档时,会尝试读取__objclass__特殊属性,读取失败时本应捕获AttributeError返回默认值,但yt_dlp的自定义__getattr__在属性不存在时直接抛出KeyError,导致help流程中断。
解决方案
- 方案1:绕过全量类遍历
直接使用dir(yt_dlp.YoutubeDL)获取所有属性、方法的名称列表,需要查询单个方法/属性的详情时,单独调用help即可,例如help(yt_dlp.YoutubeDL.download),单属性查询不会触发全量类遍历的bug。 - 方案2:临时打兼容补丁
在调用help前添加补丁代码,修正特殊属性读取时的报错类型:import yt_dlp from yt_dlp.utils import LazyList # 补丁:双下划线开头的特殊属性读取失败时抛出AttributeError而非KeyError _origin_getattr = LazyList.__getattr__ def _patched_getattr(self, attr): if attr.startswith("__"): raise AttributeError(attr) return _origin_getattr(self, attr) LazyList.__getattr__ = _patched_getattr # 补丁执行后即可正常调用help help(yt_dlp.YoutubeDL) - 方案3:升级yt_dlp版本
该兼容问题在后续发布的yt_dlp新版本中已修复,执行命令升级到最新版即可正常使用help:pip install -U yt-dlp
内容的提问来源于stack exchange,提问作者work
相关产品推荐
相关产品推荐

