Используя вывод argparse для вызывания функций

В настоящее время мой код похож на это. Это позволяет мне анализировать несколько параметров, которые получает мой сценарий программы. Существует ли другой путь, который ближе к 'лучшим практикам'? Я не видел код на самом деле с помощью вывода argparse, только, как настроить его.

def useArguments():
    x = 0
    while x <= 5:
        if x == 0:                      
            if args.getweather != None:
                getWeather(args.getweather)
        if x == 1:
            if args.post != None:
                post(args.post)
        if x == 2:
            if args.custompost != None:
                custompost(args.custompost)
        if x == 3:
            if args.list != None:
                listAccounts(args.list)
        if x == 4:
            if args.add != None:
                addAccount(args.add[0])
        if x == 5:
            if args.edit != None:
                editAccount(args.edit[0])
        x = x + 1    


if __name__ == '__main__':

    updateConfig()

    parser = argparse.ArgumentParser(description='Post Yahoo weather to Twitter.', epilog="Report any bugs to example@email.com", prog='Program')

    parser.add_argument('-a', '--add', nargs=1, help='Add a new account. Use the desired account name as an argument.')
    parser.add_argument('-e', '--edit', nargs=1, choices=accountListSTR[:-1], help='Edit an account. Use the desired account name as an argument.')
    parser.add_argument('-g', '--getweather', nargs='*', choices=accountListSTR, help='Get weather and post here. Specify account(s) as argument. Use "all" for all accounts. If you specify multiple accounts, separate by a space NOT a comma.')
    parser.add_argument('-p', '--post', nargs='*', choices=accountListSTR, help='Post weather to Twitter. Specify account(s) as argument. Use "all" for all accounts. If you specify multiple accounts, separate by a space NOT a comma.')
    parser.add_argument('-c', '--custompost', nargs=2, help='Post a custom message. Specify an account then type the message. Make sure you use "" around the message. Use "all" for all accounts.')
    parser.add_argument('-l', '--list', action='store_const', const='all', help='List all accounts.')
    parser.add_argument('--version', action='version', version='%(prog)s 0.3.3')

    args = parser.parse_args()

    useArguments()
11
задан avacariu 11 August 2010 в 02:51
поделиться

2 ответа

Вы могли бы предоставить пользовательское действие для аргумента by, и я цитирую:

передача объекта, реализующего API действий. Самый простой способ сделать это заключается в расширении argparse.Action, предоставление соответствующего __ звонка __ метод. Метод __ call __ должен принять четыре параметра:

  1. parser : объект ArgumentParser, который содержит это действие.
  2. пространство имен : объект пространства имен, который будет возвращен функцией parse_args () .Большинство действий добавляют атрибут к этому объекту.
  3. values ​​: связанные аргументы командной строки с любыми примененными преобразованиями типов. (Преобразования типов указываются аргументом ключевого слова типа в add_argument () .
  4. option_string ]: Строка параметра, которая использовалась для вызова этого действия. Аргумент option_string является необязательным и будет отсутствовать, если действие связано с позиционным аргументом.
11
ответ дан 3 December 2019 в 05:32
поделиться

За исключением - версии , которая очень часто используется, указанные вами действия лучше рассматривать как «подкоманды».

Мне неизвестны особенности argparse, так как я еще не пробовал Python 2.7, но вы можете взглянуть на команду svn в качестве примера, вот некоторый псевдокод для командной строки:

myprog [--version] <command> [<command opts>...]

Где in:

add|edit|getweather|post|custompost|list

и - параметры, специфичные для этой команды. Использование optparse (аналогичного) будет означать, что ваша команда будет возвращена в args при вызове parse_args , что позволит вам сделать что-то вроде этого:

opts, args = parser.parse_args()
if opts.version:
    ...
else:
    getattr("do_" + args[0])(*args[1:])

Я нахожу это шаблон, особенно полезный для отладки, где я предоставляю доступ к внутренним функциям из командной строки и передаю различные аргументы для тестирования. Отрегулируйте выбор обработчика команд в соответствии с вашим собственным проектом.

4
ответ дан 3 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: