11

現在、私のコードは次のようになっています。これにより、プログラム スクリプトが取得する複数のパラメーターを解析できます。「ベストプラクティス」に近い別の方法はありますか? の出力を実際に使用しているコードは見たことがなくargparse、セットアップ方法だけです。

def useArguments():
    x = 0
    while x <= 5:
        if x == 0:                      
            if args.getweather != None:
                getWeather(args.getweather)
        if x == 1:
            if args.post != None:
                post(args.post)
        if x == 2:
            if args.custompost != None:
                custompost(args.custompost)
        if x == 3:
            if args.list != None:
                listAccounts(args.list)
        if x == 4:
            if args.add != None:
                addAccount(args.add[0])
        if x == 5:
            if args.edit != None:
                editAccount(args.edit[0])
        x = x + 1    


if __name__ == '__main__':

    updateConfig()

    parser = argparse.ArgumentParser(description='Post Yahoo weather to Twitter.', epilog="Report any bugs to example@email.com", prog='Program')

    parser.add_argument('-a', '--add', nargs=1, help='Add a new account. Use the desired account name as an argument.')
    parser.add_argument('-e', '--edit', nargs=1, choices=accountListSTR[:-1], help='Edit an account. Use the desired account name as an argument.')
    parser.add_argument('-g', '--getweather', nargs='*', choices=accountListSTR, help='Get weather and post here. Specify account(s) as argument. Use "all" for all accounts. If you specify multiple accounts, separate by a space NOT a comma.')
    parser.add_argument('-p', '--post', nargs='*', choices=accountListSTR, help='Post weather to Twitter. Specify account(s) as argument. Use "all" for all accounts. If you specify multiple accounts, separate by a space NOT a comma.')
    parser.add_argument('-c', '--custompost', nargs=2, help='Post a custom message. Specify an account then type the message. Make sure you use "" around the message. Use "all" for all accounts.')
    parser.add_argument('-l', '--list', action='store_const', const='all', help='List all accounts.')
    parser.add_argument('--version', action='version', version='%(prog)s 0.3.3')

    args = parser.parse_args()

    useArguments()
4

3 に答える 3

11

引数にカスタムアクションを指定できます。

Action API を実装するオブジェクトを渡します。これを行う最も簡単な方法は、適切なメソッドを提供して argparse.Action を拡張すること__call__ です。この__call__メソッドは、次の 4 つのパラメーターを受け入れる必要があります。

  1. parser : このアクションを含む ArgumentParser オブジェクト。
  2. namespace : によって返される名前空間オブジェクトparse_args()。ほとんどのアクションは、このオブジェクトに属性を追加します。
  3. values : 型変換が適用された、関連するコマンドライン引数。 (型変換は、 type キーワード引数で指定されadd_argument()ます。
  4. option_string : このアクションを呼び出すために使用されたオプション文字列。option_string 引数はオプションであり、アクションが位置引数に関連付けられている場合は存在しません。
于 2010-08-11T03:36:46.803 に答える
6

http://docs.python.org/library/argparse.html#sub-commandsを参照してください:

サブコマンドを処理する特に効果的な方法の 1 つは、add_subparsers()メソッドの使用と への呼び出しを組み合わせてset_defaults()、各サブパーサーが実行すべき Python 関数を認識できるようにすることです。

手短に:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

weather_parser = subparsers.add_parser('get-weather')
weather_parser.add_argument('--bar')
weather_parser.set_defaults(function=get_weather)  # !

args = parser.parse_args(['get-weather', '--bar', 'quux'])
print args.function(args)

ここでは、コマンドのサブパーサーを作成し、それにget-weather関数を割り当てget_weatherます。

ドキュメントには、キーワード/属性に名前funcが付けられていると書かれていますが、それは間違いなくfunctionargparse 1.1 の時点のものであることに注意してください。

結果のコードは少し長すぎるので、物事を簡単にする小さなパッケージ「argh」を公開しました。

parser = argparse.ArgumentParser()
add_commands(parser, [get_weather])
print dispatch(parser, ['get-weather', '--bar', 'quux'])

「Argh」にはもっと多くのことができますが、スタックオーバーフローに答えさせます。:-)

于 2010-11-12T21:43:37.867 に答える
4

非常に一般的なオプションである を除いて--version、提供したアクションは「サブコマンド」として扱ったほうがよいでしょう。

Python 2.7 はまだ試していないので、argparse の詳細はわかりませんがsvn、例としてコマンドを見てください。コマンド ラインの疑似コードを次に示します。

myprog [--version] <command> [<command opts>...]

どこ<command>で:

add|edit|getweather|post|custompost|list

そして<command opts>、そのコマンドに固有のオプションです。optparse を使用すると (同様です)、これはargs、 を呼び出したときにコマンドが に返され、parse_args次のようなことができることを意味します。

opts, args = parser.parse_args()
if opts.version:
    ...
else:
    getattr("do_" + args[0])(*args[1:])

このパターンは、コマンド ラインから内部関数へのアクセスを提供し、テスト用にさまざまな引数を渡すデバッグに特に役立つと思います。独自のプロジェクトに合わせて、コマンド ハンドラーの選択を調整します。

于 2010-08-11T03:10:39.707 に答える