2012-06-11 14 views
5

私は多数の潜在的なargを持つプログラムを持っています。 基本的に、ユーザは非常に小さなデータベース内の任意のテーブルget/set/delete/listにすることができます。各列には渡すことができるargがあります。
これはメインインターフェイスではなく、時には便利な管理インターフェイスです。対話型プロンプトをPythonでargparseと組み合わせるにはどうすればいいですか?

ユーザーがテーブルに行を挿入する場合は、すべての列の名前を知る必要があります。助けからそれを見るのは簡単ですが、それはまたお尻の痛みです。

コードを変更して、ユーザーが--promptオプションを渡すようにしました。プログラムは、指定したテーブルに関連付けられているすべての列名に対してプロンプトを表示します。しかし、私の問題は、今、入力制約(選択肢、型など)をargparseとこのプロンプト関数の2つの場所に複製する必要があることです。

  • 質問#1:これを行う良い方法はありますか?
  • 質問#2:この目的のためにargparse制約を参照する明確な方法がありますか?
  • 質問#3:コマンドライン引数、オプション、プロンプトを組み合わせた代替ライブラリとして推奨されているライブラリはありますか?

おかげ

答えて

3

カスタムアクションとなり、これを行うための一般的な方法。 argparseオプションを指定して、入力をこのような同じ関数で検証することができます。

#!/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) 
関連する問題