В настоящее время мой код похож на это. Это позволяет мне анализировать несколько параметров, которые получает мой сценарий программы. Существует ли другой путь, который ближе к 'лучшим практикам'? Я не видел код на самом деле с помощью вывода 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()
Вы могли бы предоставить пользовательское действие для аргумента by, и я цитирую:
передача объекта, реализующего API действий. Самый простой способ сделать это заключается в расширении argparse.Action, предоставление соответствующего
__ звонка __
метод. Метод__ call __
должен принять четыре параметра:
- parser : объект ArgumentParser, который содержит это действие.
- пространство имен : объект пространства имен, который будет возвращен функцией
parse_args ()
.Большинство действий добавляют атрибут к этому объекту.- values : связанные аргументы командной строки с любыми примененными преобразованиями типов. (Преобразования типов указываются аргументом ключевого слова типа в
add_argument ()
.- option_string ]: Строка параметра, которая использовалась для вызова этого действия. Аргумент option_string является необязательным и будет отсутствовать, если действие связано с позиционным аргументом.
За исключением - версии
, которая очень часто используется, указанные вами действия лучше рассматривать как «подкоманды».
Мне неизвестны особенности 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:])
Я нахожу это шаблон, особенно полезный для отладки, где я предоставляю доступ к внутренним функциям из командной строки и передаю различные аргументы для тестирования. Отрегулируйте выбор обработчика команд в соответствии с вашим собственным проектом.