2012-06-11 15 views
5

Mam program z dużą liczbą potencjalnych argumentów. W zasadzie pozwala użytkownikowi na get/set/delete/list dowolnej tabeli w bardzo małej bazie danych. Każda kolumna ma argument, który można przekazać.
To nie jest główny interfejs, tylko okazjonalnie przydatny interfejs administratora.Jak połączyć interaktywne podpowiedzi z argparse w pythonie?

W każdym razie, jeśli użytkownik chce wstawić wiersz do tabeli, musi znać nazwę wszystkich kolumn. Łatwo to zauważyć z pomocy - to także ból w tyłku.

Tak, zmieniłem kod, aby użytkownik mógł przekazać opcję --prompt, a program wyświetli monit o podanie każdej nazwy kolumny powiązanej z podaną tabelą. Ale moim problemem jest to, że muszę teraz duplikować moje ograniczenia wejściowe (wybory, typy, itp.) W dwóch miejscach - argparse i ta funkcja monitowania.

  • Pytanie nr 1: czy jest lepszy sposób na zrobienie tego?
  • Pytanie nr 2: czy istnieje czysty sposób na odwołanie się do ograniczeń argparse w tym celu?
  • Pytanie nr 3: czy są jakieś biblioteki zalecane jako alternatywy łączące argumenty linii poleceń, opcje i podpowiedzi?

Dzięki

Odpowiedz

3

Typowym sposobem na to byłoby z akcji niestandardowych. Możesz mieć opcję argparse i dane wejściowe sprawdzane za pomocą tej samej funkcji, jak ta.

#!/usr/bin/env python3 

import argparse 


class ColumnsAction(argparse.Action): 
    def __call__(self, parser, namespace, value, option_string=None): 
     self.validate(parser, value) 
     setattr(namespace, self.dest, value) 

    @staticmethod 
    def validate(parser, value): 
     if value not in ('foo', 'bar'): 
      parser.error('{} not valid column'.format(value)) 


parser = argparse.ArgumentParser() 
parser.add_argument('--columns', action=ColumnsAction) 
args = parser.parse_args() 
if args.columns is None: 
    args.columns = input('Enter columns: ') 
    ColumnsAction.validate(parser, args.columns) 
print(args.columns)