1

Python でのさまざまなオプションと引数の解析の選択のメリットに関する関連する議論については、こちらを参照してください。

私は Python の の出力できちんとしたことを行う diff スクリプトを作成していますdifflib。その一部は、それを呼び出すことができるさまざまな方法を処理することです。たとえば、Git は 7 つの引数 (2 番目と 5 番目は diff したいファイル) を設定した diff プログラムに送ります。興味深いことに、git のdifftoolフラグ--extcmd=は、指定した 2 つの引数だけで異なるものを呼び出します。

したがって、これを行うために OptionParser を使用するのは非常に簡単です。これは、引数のリストを提供するだけで、2 番目と 5 番目の引数を取得して に送信できるからfileinputです。

pydoc に非推奨であるという大きなバナーがあることに気付いたので、 を調べていましたargparse

argparse「開始」オプションなしで、プログラムが一連の位置引数を受け入れるように構成することさえ可能かどうかは、私にはまったくわかりませんでした。Git が異なるメソッドを呼び出すなどの方法を変更できないため、これが必要でした。

とにかく、私は の非常に些細な操作をsys.argv行うことになりました。これは、結局のところ、この特定の状況で最初に行うべきことでした。

if len(sys.argv) == 8:
        # assume this was passed to git; we can of course do
        # some parsing to check if we got valid git style args
        args = [sys.argv[2], sys.argv[5]]
elif len(sys.argv) == 3:
        args = sys.argv[:1]
else:
        sys.exit("Not a valid number of args (2 or 7) to this diff program")
print "Files: " + ' '.join(args)

argparse を使用して、単にすべての引数を開いて読み取ろうとするプログラムを実装するにはどうすればよいでしょうか?

その理由は、forargparseを非推奨parseoptにするには、そのすべての機能を (妥当な範囲内で) 複製できる必要があるからです。

4

3 に答える 3

1

前にダッシュがない引数を追加するだけです。

import argparse
parser = argparse.ArgumentParser()
# You can change nargs to '+' for at least one argument
parser.add_argument('positional', nargs=2) # Positionals have no dashes
parser.add_argument('second_positional', nargs=1) 
parser.add_arguemnt('--optional', '-o')    # Optionals have dashes
args = parser.parse_args()

print args['positional'] # Your first two positional arguments
print args['second_positional'] # Second set
print args['optional'] # An optional argument
于 2013-06-12T20:51:37.267 に答える
1

0 個以上の位置引数を取るこの例を作成しました。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('args', metavar='arg', type=str, nargs='*',
    help='zero or more positional arguments')

args = parser.parse_args()
print args.arguments
于 2013-06-12T20:55:15.973 に答える
0

このためのカスタム アクションを定義することもできますがargs、このアクションを必要とする多くの引数がない限り、実際には後処理とそれほど違いはありません。

import argparse

class TwoOrSeven(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        if len(values) not in (2,7):
            raise argparse.ArgumentTypeError('Not a valid number of args (2 or 7)')
        try:
            values = values[2], values[5]
        except IndexError:
            values = values[0]
        setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument('args', metavar='arg', action=TwoOrSeven, nargs='+',
    help='Must be supplied 2 or 7 arguments')

args = parser.parse_args('1 2 3 4 5 6 7'.split())
print(args)
# Namespace(args=('3', '6'))
args = parser.parse_args('1 2'.split())
print(args)
# Namespace(args='1')
args = parser.parse_args('1 2 3 4 5 6'.split())
# argparse.ArgumentTypeError: Not a valid number of args (2 or 7)
于 2013-06-12T21:07:01.570 に答える