Python 3 エンジニア認定基礎試験 無料問題 10 / 10 ・ 分野10: 10章 標準ライブラリめぐり
次のスクリプトを python head.py -l 3 report.txt notes.txt と実行したとき、args.files の値はどれか。 import argparse parser = argparse.ArgumentParser(prog='head') parser.add_argument('files', nargs='+') parser.add_argument('-l', '--lines', type=int, default=10) args = parser.parse_args()
- ('report.txt', 'notes.txt')
- ('report.txt notes.txt',)
- ['report.txt notes.txt']
- ['report.txt', 'notes.txt']
正解と解説を見る
正解: D
正解の理由
argparse モジュールは、コマンドライン引数を処理するための、sys.argv をそのまま読むより洗練された仕組みである。add_argument('files', nargs='+') は、位置引数 files に1つ以上の値を受け取らせる指定で、受け取った値はリストにまとめられる。-l 3 はオプション --lines の値として処理され、type=int により整数 3 になる。残りの report.txt と notes.txt が files に入るので、args.files は ['report.txt', 'notes.txt'] になる。チュートリアルの例でも、ファイル名2つを渡すと args.filenames が ['alpha.txt', 'beta.txt'] に設定されると説明されている。
違う選択肢
「('report.txt', 'notes.txt')」… nargs='+' で受け取った複数の値は、タプルではなくリストにまとめられる。チュートリアルの例でも、args.filenames は角かっこで囲まれたリストとして示されている。
「['report.txt notes.txt']」… report.txt と notes.txt は、コマンドラインで空白で区切られた別々の引数として渡される。argparse はそれを1つの文字列につながず、1つずつを要素にしたリストにする。
「('report.txt notes.txt',)」… 値はタプルにまとめられず、1つの文字列につながれることもない。2つのファイル名は、それぞれ別の要素としてリストに入る。
関連する指定
オプションを省いて python head.py report.txt と実行すると、args.lines には default=10 の 10 が入る。位置引数とオプションはコマンドライン上の順番に関係なく区別され、-l の直後の 3 はオプションの値として使われるので、files には入らない。