GNU getopt と、それを使用するコマンド ライン ツールを使用すると、オプションと引数を交互に並べることができます。 -Getopt )。Perl の Getopt::Long モジュールもこれをサポートしています (qw(:config gnu_getopt) を使用)。argparse は、並べ替えオプションをサポートしていないようです (または言及していません)。
arg/opt の順序に関連する SO の質問はたくさんありますが、この質問に答えるものはないようです。
ユース ケースは、GNU sort のような典型的なコマンド ライン シグネチャです。
sort [opts] [files]
1) オプションとファイルが並べ替えられ、2) ファイル リストには 0 個以上の引数が含まれる場合があります。
例えば:
import argparse
p = argparse.ArgumentParser();
p.add_argument('files',nargs='*',default=['-']);
p.add_argument('-z',action='store_true')
p.parse_args(['-z','bar','foo']) # ok
p.parse_args(['bar','foo','-z']) # ok
p.parse_args(['bar','-z','foo']) # not okay
usage: ipython [-h] [-z] [files [files ...]]
私はもう試した:
- p.parse_known_args -- 文句を言いませんが、実際には並べ替えもしませんし、無効なオプションのように見える引数 (例えば、上記の --bogus や -b) についても躊躇しません。
- p.add_argument('files',nargs=argparse.REMAINDER) -- 位置引数の前でない限り、オプション -z がファイルに含まれます
- p.add_argument('files',nargs='*',action='append');
上記の GNU ソート プロトタイプに近いものを実装したいと考えています。ファイルごとに指定できるフラグ (例: -f file1 -f file2) には興味がありません。