Как я могу передать необязательный параметр в класс Python, используя функцию argparse в Python - PullRequest
1 голос
/ 19 апреля 2019

У меня есть скрипт 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 хранит 2 значения: test или prod. Параметр env должен быть необязательным, если значения не предоставлены, он должен принимать значения по умолчанию как prod, иначе он должен хранить любое из предоставленных значений (test / prod). если значение env не передается, значением по умолчанию должно быть prod Я попытался сделать параметр env необязательным, используя nargs, но когда мой скрипт выполняется, он выдает ошибку.

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 ]

3 голосов
/ 19 апреля 2019

Если вы просто хотите, чтобы env был "prod" или "test", вы можете использовать choices ( docs ) со значением по умолчанию:

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

Это вызовет ошибку, если что-то еще будет передано --env.

Обратите внимание, что флаги с тире, такими как -e --env, считаются необязательными в argparse ( docs )

1 голос
/ 19 апреля 2019

Разве это не должно быть без args?:

self.env = parsers.env.strip()

, также вы можете обработать AttributeError:

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