2012-11-27 14 views
5

Obecnie używam argparse do analizowania argumentów i zapisywania flag jako opcji boolowskich. Następnie sprawdzam, która flaga jest ustawiona na true i wykonuje tę funkcję. Argparse analizuje plik wejściowy, który jest otwierany i przekazywany do wywoływanej funkcji jako argument.argparse wywołanie funkcji po analizie innych opcji

Więc:

parser.add_argument('input_data', action='store', help='some help') 
parser.add_argument('outputname', action='store',default=None, help='some help') 
parser.add_argument('--flag','-f', action='store_true', dest='flag', default=False, help='help!') 

muszę otworzyć input_data czytać informacje z nim zanim funkcja flaga jest tzw. To jest obecnie realizowany jako:

if args.flag == True: 
    array_out = flag(array_read_from_input) 
    if args.outputname == None: 
     name = 'Flag.tif' 

Możliwe jest subclass argparse mieć kluczowe działanie wywołać funkcję.

Czy można przeanalizować opcję input_data, wykonać trochę przetwarzania, a następnie wywołać funkcję flag bez zagnieżdżania się w pętli dla każdego argumentu, np. Poprzez podklasowanie parametru działania argparse?

+0

Nie należy porównywać obiektów z wartościami "Prawda" lub "Brak". Użyj 'jest' lub użyj wartości prawdy obiektu (tak powinno być' if args.flag: ... 'i' if args.outputname is None'). Ponadto wiesz, że możesz tworzyć niestandardowe akcje, prawda? Po prostu przeczytaj dokumentację argparse. – Bakuriu

+0

@Bururiu "Możliwe jest podklasy argparse, aby słowo kluczowe action wywoływać funkcję." Nie chodzi o to, czy możliwe jest stworzenie niestandardowej akcji, ale czy można ją wywołać po analizie i manipulowaniu innymi argumentami. – Jzl5325

+0

Jeśli chcesz go nazwać * po * analizie, to nie rozumiem, jaki jest stosunek "argparse" do twojego pytania. Ten moduł jest dostępny tylko po to, aby parsować wiersz poleceń i ostatecznie wykonywać akcje * podczas * analizy. Ponadto, nie rozumiem, co jest nie tak z podwójnym "jeśli". Na marginesie: nic nie zabrania korzystania z podklasy [parser] (http://docs.python.org/dev/library/argparse.html#argumentparser-objects) i ponownego zaimplementowania 'parse_args', dzięki czemu funkcja jest tam wywoływana, ale nadal będziesz musiał umieścić podwójne "jeśli" tam. – Bakuriu

Odpowiedz

0

Czy to możliwe, aby przeanalizować opcję input_data wykonać pewne przetwarzanie, a następnie wywołać funkcję flagi bez zagnieżdżone jeśli pętle dla każdego argumentu, np., Przez instacji działania parametr argparse za?

Jak na swoje pytanie;

class FooAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     << some processing of values >> 
     array_out = flag(values) 
     setattr(namespace, self.dest, array_out) 

parser = argparse.ArgumentParser() 
parser.add_argument('input_data', action=FooAction, help='some help') 
Powiązane problemy