我如何在python中使用argparse函数将可选参数传递给python类

时间:2019-04-19 05:15:55

标签: python argparse

我有一个Python脚本script.py,该脚本具有以下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")
    parser.add_argument('-e', '--env', nargs='*',
                        dest='env',help="the env type")
    parsers = parser.parse_args()
    self.user = parsers.user.strip()
    self.url = parsers.url.strip()
    self.env = parsers.args.env.strip()

env类型存储两个值testprodenv参数应该是可选的,如果未提供值,则其默认值应为prod,否则应存储提供的任何值(测试/生产)。如果没有传递env的值,则默认值为prod 我尝试使用envnargs参数设置为可选参数,但执行脚本时会抛出错误。

Traceback (most recent call last):
  File "script.py", line 185, in <module>
    obj = script()
  File "script.py", line 66, in __init__
    self.env_type = parsers.args.env_type.strip()
AttributeError: 'Namespace' object has no attribute 'args'

我以

的身份执行脚本
python script.py -u <user> -i <url> -e <env>

理想情况下,即使没有提供-e选项,我也希望我的脚本能够执行。 我应该如何更改脚本?

2 个答案:

答案 0 :(得分:3)

如果您只希望env为“ prod”或“ test”,则可以使用choicesdocs),其默认值为:

parser.add_argument('-e', '--env', choices=['prod', 'test'], default='prod', help="the env type")

如果将其他内容传递给--env,则会引发错误。

请注意,在argparse(docs)中,带有-e --env等破折号的标记被认为是可选的

答案 1 :(得分:1)

应该没有args吗?

self.env = parsers.env.strip()

您还可以处理AttributeError:

try:
    self.env = parsers.env.strip()
except AttributeError:
    self.env = 'prod'