Python访问字典报TypeError错误,三文件架构代码优化咨询
问题解决方法
报错根本原因
- 字典访问语法错误:你写的
[c.appList][v.appCode]、[c.appList][args.a]是完全错误的写法。[c.appList]会把原本的字典对象包裹成一个只有1个元素的列表,列表只能使用整数作为索引,你传入字符串或空的参数值时,就会触发类型错误。 - 参数可能为空:你的argparse配置没有给三个入参加
required=True约束,运行时如果没有传入对应的-u/-a/-f参数,args.u/args.a/args.f就会是None,用None作为索引访问列表/字典也会触发该报错。 - 提前格式化占位符:你在config.py的
appAddress字段提前用v.profil做了格式化,此时v.profil还没有被赋值,会导致配置初始化就出错。 - 字典key不匹配:当前
appList的顶级key是app1、app14,如果你传入的-a参数是appCode字段的xyz,也会找不到对应值。
修复方案
1. 修正字典访问语法
把varDefining函数里所有包裹字典的多余方括号全部删掉:
def varDefining(): v.user = args.u v.appCode = args.a v.appFunc = args.f v.profil = c.userList[v.user]["profil"] v.appID = c.appList[v.appCode]["appID"] # 此处再对appAddress做格式化 v.appPath = c.appList[v.appCode]["appAddress"].format(v.profil) v.appRemoteDebug = c.appList[v.appCode]["appRemoteDebug"]
你测试的打印代码也改成:
print(c.appList.get(args.a))
2. 补全argparse参数约束
给三个入参加上required=True,避免参数为空:
parser.add_argument("-u", type=str, dest='u', help="the user", required=True) parser.add_argument("-a", type=str, dest='a', help="the app", required=True) parser.add_argument("-f", type=str, dest='f', help="the function", required=True)
3. 修改config.py的模板写法
把appAddress的格式化操作后置,只保留模板字符串:
"appAddress": '/opt/google/chrome/google-chrome "--profile-directory=Profile {0}"',
4. 对齐字典key与入参
如果要通过appCode字段匹配应用,要么把appList的顶级key改成对应appCode的值,要么修改校验逻辑遍历匹配appCode字段。
编码优化建议
- 你设计的三文件拆分架构是合理的,符合配置、入口逻辑、全局变量分离的设计规范,很多生产级Python项目都采用类似分层设计。
- 校验函数可以直接返回布尔表达式,无需多层if判断:
def checkUser(dico, user): return user in dico def checkArgs(dico, webapp, functions, function): return webapp in dico and functions in dico[webapp] and function in dico[webapp][functions]
- 访问字典时优先用
get方法,避免触发KeyError直接崩溃,例如c.appList.get(v.appCode, {}),取不到值时会返回空字典。 - 变量命名尽量提高可读性,例如
v可以改成variables或ctx,c改成config,降低后续维护成本。
内容的提问来源于stack exchange,提问作者MatMat
相关产品推荐
相关产品推荐

