Принятие пользовательского ввода для аргументов Argparse - PullRequest
0 голосов
/ 19 ноября 2018

Как бы я определил значение с плавающей запятой для каждого аргумента в приглашении пользователя?В настоящее время я использую default = x, но скорее позволю пользователю определить несколько переменных, прежде чем собирать их вместе и передавать в функцию.

Я думал, что мог бы сделать что-то вроде:

first = input("first float") 
second = input("second float")
third = input("third float")

... но я получаю: TypeError ("неподдерживаемые типы операндов для * =: 'float' и 'NoneType'",)

Вот код, который работает нормально, но использует default =x против приглашения пользователя.

import sys
import argparse

if __name__ == "__main__":
    args = sys.argv
    args.pop(0)
    arg_parser = argparse.ArgumentParser("Help")

    arg_parser.add_argument("--first", type=float, help="first value", default=1)
    arg_parser.add_argument("--second", type=float, help="second value", default=2)
    arg_parser.add_argument("--third", type=float, help="third value", default=3)
    args = arg_parser.parse_args(args)    
    whatever = WhateverWhatever(args.first, args.second, args.third)
    whatever.start()

class WhateverWhatever:
    def __init__(self, first = 1, second = 2, third = 3):
        self.first = first
        self.second = second
        self.third = third

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

При разборе по умолчанию используется sys.argv[1:]

args = arg_parser.parse_args() 

Вы также можете предоставить аналогичный список

args = arg_parser.parse_args('--first 1 --second 23 --third 42'.split()) 

Это хорошая идея при тестировании от argparse до

print(args)

чтобы увидеть, что сгенерировал синтаксический анализатор.

Соответствующий объект пространства имен можно создать с помощью:

 args = argparse.Namespace(first=1, second=43, third=23)

Или args может быть любым объектом с соответствующими атрибутами, args.first и т. д.

0 голосов
/ 27 декабря 2018

Вы можете запустить свой код в консоли, написав

python <PythonFileName.py> --first=<first input> --second=<second input> --third=<third input>

вам не нужно писать метод ввода внутри вашего кода.

0 голосов
/ 19 ноября 2018

Ну, это оказалось чрезвычайно очевидно.

import sys
import argparse

if __name__ == "__main__":
    args = sys.argv
    args.pop(0)
    arg_parser = argparse.ArgumentParser("Help")

    arg_parser.add_argument("--first", type=float, help="first value", default=1)
    arg_parser.add_argument("--second", type=float, help="second value", default=2)
    arg_parser.add_argument("--third", type=float, help="third value", default=3)
    args = arg_parser.parse_args(args)  

    args.first = float(input("First value"))
    args.second = float(input("Second value"))
    args.third = float(input("Third value"))

    whatever = WhateverWhatever(args.first, args.second, args.third)
    whatever.start()

class WhateverWhatever:
    def __init__(self, first = 1, second = 2, third = 3):
        self.first = first
        self.second = second
        self.third = third   
...