如何在Python类中用argparse实现可选env参数并修正报错
问题解决步骤
咱们一步一步来搞定这个问题,主要有两个核心问题需要修正:
1. 先搞定报错的根源
你碰到的 AttributeError: 'Namespace' object has no attribute 'args',是因为 parser.parse_args() 直接返回了一个Namespace对象,所有定义的参数(比如user、url、env)都是这个对象的直接属性,根本不需要加.args去嵌套访问。直接写 parsers.参数名 就能拿到对应的值。
2. 调整env参数的配置,匹配你的需求
原来的env参数设置完全不符合你的要求(可选参数、默认值为prod、只能取test/prod),需要做这几个调整:
- 删掉
nargs='*':这个配置会把env变成列表类型,但你要的是单个字符串值 - 添加
default='prod':没传-e的时候自动用prod当默认值 - 加上
choices=['test', 'prod']:限制用户只能输入这两个值,避免非法输入 - 明确
required=False(可选,因为默认就是False,但写上会更清晰)
修改后的完整__init__代码
def __init__(self): """init method for the class.""" parser = argparse.ArgumentParser(description="test") parser.add_argument('-u', '--user', dest='user', default='', required=True, action="store", help="the script running user") parser.add_argument('-i', '--url', dest='url', default="", required=True, action="store", help="url") # 调整env参数的配置,满足需求 parser.add_argument('-e', '--env', dest='env', default='prod', required=False, choices=['test', 'prod'], action="store", help="the env type (test/prod, default: prod)") parsers = parser.parse_args() self.user = parsers.user.strip() self.url = parsers.url.strip() # 修复参数访问方式,去掉多余的.args self.env = parsers.env.strip()
测试验证一下
- 不传入
-e时:执行python script.py -u <user> -i <url>,self.env会自动设为prod - 传入
-e时:执行python script.py -u <user> -i <url> -e test,self.env就是test;要是输入其他值(比如dev),argparse会直接报错提示可选值,非常稳妥
内容的提问来源于stack exchange,提问作者noob_coder
相关产品推荐
相关产品推荐

