Python Click报错:module 'click' has no attribute 'hidden'
错误原因
报错的核心是list_commands方法的属性过滤逻辑有缺陷:
- 现有逻辑仅排除了双下划线开头的模块内置属性,会把
commands.py里导入的其他模块、普通变量、非命令函数全部当成子命令返回 - 从报错栈可以看到,Click渲染帮助信息时,会遍历所有返回的子命令,读取每个命令的
hidden属性判断是否需要在帮助页隐藏 - 你的
commands.py中大概率导入了click模块,这个模块对象被错误识别为子命令,而click模块本身没有hidden属性,因此触发属性错误 - 你硬编码返回指定命令名时不会触发全量属性遍历,自然不会拿到
click模块对象,错误就消失了
修复方案
修改两处逻辑,确保只返回合法的Click命令对象:
- 优化
list_commands方法,收集命令时校验对象类型,只保留Click命令实例
def list_commands(self, ctx): rv = [] for name in dir(commands): if name.startswith("__"): continue cmd_obj = getattr(commands, name) # 仅收集真正的Click命令 if isinstance(cmd_obj, click.Command): rv.append(name) rv.sort() return rv
- 给
get_command方法增加类型校验,避免返回非命令对象
def get_command(self, ctx, name): try: mod = importlib.import_module('ogcmaps.utils.commands') cmd_obj = getattr(mod, name, None) if isinstance(cmd_obj, click.Command): return cmd_obj return None except ImportError: return
改完之后,导入的click模块、其他普通工具函数/变量都不会被误识别为子命令,报错就会消失。
内容的提问来源于stack exchange,提问作者Prakhar Gurunani
相关产品推荐
相关产品推荐

