2014-01-16 4 views
1

У меня возникли проблемы с пониманием правильного выполнения функций на основе аргументов с использованием argparse и Python 2.7. Сам скрипт предназначен для Caesar's cipher.Как правильно вызвать функцию с помощью argparse?

import argparse 

def encipher(s): 
    pass 

def decipher(s): 
    pass 

def main(): 
    parser = argparse.ArgumentParser(description="(de)cipher a string using Caesar's cipher") 
    group = parser.add_mutually_exclusive_group(required=True) 
    parser.add_argument('-s', default=1, help='shift length') 
    group.add_argument('-c', dest='action', action='store_const', const=encipher, help='encipher a string') 
    group.add_argument('-d', dest='action', action='store_const', const=decipher, help='decipher a string') 
    parser.add_argument('s', metavar='string', help='string to (de)cipher') 

    # call function (action) with string here 

if __name__ == '__main__': 
    main() 

Где подразумевается использование быть:

$ ./cipher.py -c "he had a strange car" 
if ibe b tusbohf dbs 

Как правильно отправить данную строку соответствующую функцию, т.е. encipher(s) с -c и decipher(s) с -d, или, возможно, с -s с другим сдвиг?

Я видел несколько примеров, указывающих на то, что вы можете проверить содержимое анализатора вручную, но разве это не победит какую-то цель?

ответ

4

Функция будет в action, строка в s:

args = parser.parse_args() 
args.action(args.s) 

Обратите внимание, что декларация -s аргументов конфликтов с пронумерованным аргументом s. Вы увидите только последний. Вы должны изменить одно из имен - например, изменить пронумерованный на string, поэтому короткий -s может оставаться таким, какой он есть.

+0

Это выглядело ужасно неправильно с первого взгляда, но затем я увидел, что OP фактически настроил свой парсер аргументов, чтобы работать таким образом. – user2357112

+0

Спасибо, это, казалось, сделало это! @ user2357112 вы бы посоветовали мне настроить его каким-либо другим способом? Я считаю, что он работает по назначению. – timss

+0

@timss: Возможно, было бы неплохо настроить ваш синтаксический анализатор так, чтобы он требовал указать только один из '-c' или' -d', но кроме этого и '-s' /' s «конфликт, это выглядит хорошо. – user2357112

Смежные вопросы