web-dev-qa-db-ja.com

引数の省略可能な位置引数は?

私はこのように使われることを意図したスクリプトを持っています:usage: installer.py dir [-h] [-v]

dirは、次のように定義された位置引数です。

parser.add_argument('dir', default=os.getcwd())

私はdirをオプションにしたいです:それが指定されていないときそれはちょうどcwdであるべきです。

残念ながら、dir引数を指定しないと、Error: Too few argumentsが返されます。

541
Waldo Bronchart

nargs='?' (または複数のディレクトリが必要な場合はnargs='*')を使用してください。

parser.add_argument('dir', nargs='?', default=os.getcwd())

拡張例:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v
696
Vinay Sajip

@VinaySajip答えへの延長として。 言及するに値する追加のnargsがあります

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N(整数)コマンドラインからのN個の引数はリストにまとめられます

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'存在するすべてのコマンドライン引数はリストにまとめられます。nargs='*'を持つ複数の位置引数を持つことは一般的にあまり意味がありませんが、nargs='*'を持つ複数のオプション引数が可能です。

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

「+」 '*'と同じように、存在するすべてのコマンドライン引数がリストにまとめられています。さらに、少なくとも1つのコマンドライン引数が存在しない場合、エラーメッセージが表示されます。

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER。残りのコマンドライン引数はすべてリストにまとめられています。これは一般に、他のコマンドラインユーティリティにディスパッチするコマンドラインユーティリティに役立ちます。

nargsキーワード引数が指定されていない場合、消費される引数の数はアクションによって決まります。一般に、これは単一のコマンドライン引数が消費され、単一の項目(リストではない)が生成されることを意味します。

57