2015-04-15 3 views
4

Я хочу, чтобы реализовать пример из Argparse интро:Как использовать argparse аргументов как имена функций

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 

Но в моем случае, я хотел бы иметь более широкий диапазон возможных имен функций, чтобы выбрать из ,

def a(): ... 
def b(): ... 
def c(): ... 

parser.add_argument('-f', '--func', 
        choices=[a, b, c], 
        required=True, 
        help="""Choose one of the specified function to be run.""") 
parser.func() 

С его помощью, как это не работает, как задумано, я получаю

$ python program.py -f=a 
program.py: error: argument -f/--func: invalid choice: 'a' (choose from 
<function a at 0x7fa15f32f5f0>, 
<function b at 0x7fa15f32faa0>, 
<function c at 0x7ff1967099b0>) 

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

+0

Но имена функций не являются функциями. Это струны. '' a 'в [a, b, c] 'является' False'. – hpaulj

ответ

3

Вы можете использовать основные строковые аргументы и минимизировать беспорядок с помощью dict, чтобы получить фактическую функцию от ее имени.

Я на Python 2.6.6, так что я не могу использовать argparse, но этот код должен дать вам общее представление:

#!/usr/bin/env python 

def a(): return 'function a' 
def b(): return 'function b' 
def c(): return 'function c' 

func_list = [a, b, c] 
func_names = [f.func_name for f in func_list] 
funcs_dict = dict(zip(func_names, func_list)) 

f = funcs_dict['b'] 
print f() 

выход

function b 

Так вы может пройти func_names до argparse и компактно получить желаемую функцию, используя funcs_dict.

+0

Я получил его, чтобы работать, спасибо, он выглядит хорошо! – Arne

2

Вы должны убедиться, что ваши choice s являются строками (пользователь не может ввести объект функции Python в командной строке). Вы можете использовать словарь для разрешения этих строк в функции. Например:

# Example functions: 
def a(i): 
    return i + 1 
def b(i): 
    return i + 2 
def c(i): 
    return i + 3 

# a dictionary mapping strings of function names to function objects: 
funcs = {'a': a, 'b': b, 'c': c} 

# Add the -f/--func argument: valid choices are function _names_ 
parser.add_argument('-f', '--func', dest='func', 
        choices=['a', 'b', 'c'], 
        required=True, 
        help="""Choose one of the specified function to be run.""") 

args = parser.parse_args() 

# Resolve the chosen function object using its name:  
chosen_func = funcs[args.func] 
1

Мой анализ, я могу пойти не так, но это мое понимание.

ArgParse позволяет создавать не просто простой объект из аргумента командной строки механизмом литья. Это позволит вам получить номер пять, если вы передадите строку «5» и указали, что вы ожидаете целого числа.

И на самом деле вы пытаетесь получить функцию из строки 'a'. Нет никакого способа сделать это. Это мое предложение, чтобы решить вашу проблему:

import argparse 

def foo(): 
    print("called foo") 

def bar(): 
    print("called bar") 

functions = [foo, bar] #list your functions here 
functions = { function.__name__ : function for function in functions} 

parser = argparse.ArgumentParser() 

parser.add_argument('-f', '--func', 
        choices=list(functions.keys()), 
        required=True, 
        help="""Choose one of the specified function to be run.""") 
args = parser.parse_args() 
functions[args.func]() 

Вы теперь просто должны зарегистрировать functons в тэ функции списка при запуске и вызывать их после последней строки благодарственных к индексу функции, которая построена из и заменить автоматически Список функций

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