Python argparse对比输入与默认文件时Namespace无k1属性报错问题问询
问题解决方法
核心错误原因
- 你错误地将
ArgumentParser实例的专属方法get_default(),调用到了parse_args()返回的Namespace对象args上,args本身没有该方法,直接触发属性查找错误。你看到的'Namespace' object has no attribute 'k1'属于报错信息的传递偏差,实际根源是错误调用方法的对象。 - 参数同时配置了
required=True和default,二者逻辑冲突:标记为required=True的参数要求用户必须主动传值,默认值不会生效,不符合你对比用户输入和默认值的需求。 - 你使用
type=argparse.FileType('r')配置参数,args.k1/args.k2拿到的是已经打开的文件对象,不是文件名字符串,直接转字符串和默认文件名对比结果不符合预期,需要取文件对象的name属性才能拿到对应文件名。 check_file函数内的死循环逻辑不合理,文件名不匹配时会无限打印报错信息,没有退出逻辑。
修复后可运行代码
import argparse def check_file(user_file, default_name): if user_file.name == default_name: print("file matches") else: print("wrong file.") if __name__ == '__main__': parser = argparse.ArgumentParser() # 移除required=True,避免和default配置冲突 parser.add_argument('-k1', type=argparse.FileType('r'), default='k1file.txt', help='file input') parser.add_argument('-k2', type=argparse.FileType('r'), default='k2file.txt', help='file input') args = parser.parse_args() # get_default是parser对象的方法,不是args的方法 check_file(args.k1, parser.get_default('k1')) check_file(args.k2, parser.get_default('k2')) # 手动关闭打开的文件对象 args.k1.close() args.k2.close()
可选优化
如果你要求用户必须主动传参,不需要走默认值,仅需要校验用户传入的文件名是否符合要求,可以将type改为str,自己控制文件打开逻辑,避免自动打开非预期文件:
import argparse import os def check_file(user_file_name, default_name): if user_file_name == default_name and os.path.isfile(user_file_name): print("file matches") # 确认文件符合要求后再打开使用 with open(user_file_name, 'r') as f: # 业务逻辑 pass else: print("wrong file.") if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-k1', type=str, required=True, help='file input') parser.add_argument('-k2', type=str, required=True, help='file input') args = parser.parse_args() check_file(args.k1, 'k1file.txt') check_file(args.k2, 'k2file.txt')
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

