- "--option" ("-o") のように "--"("-") で始まる引数は元からオプションの扱いのため default を指定するだけで省略時にデフォルト値が設定される
- "--” で始まらない引数(位置引数)は必須の扱いであり、省略可能とするには (required=False ではなく) nargs='?' と default の指定が必要
正しい方法
- nargs='?' を指定
- default を指定 (指定しなかった場合はNoneになる)
argtest.py
import argparse
ap = argparse.ArgumentParser()
# --で始まらない引数は位置引数
ap.add_argument('posarg1', default='default-pos', nargs='?')
# defaultを指定しない位置引数
ap.add_argument('posarg2', nargs='?')
# --で始まる引数はオプション引数
ap.add_argument('--optarg', default='default-option')
arg = ap.parse_args()
print(f'posarg1={arg.posarg1}')
print(f'posarg2={arg.posarg2}')
print(f'optarg={arg.optarg}')
実行結果
% python argtest.py
posarg1=default-pos
posarg2=None
optarg=default-option
失敗した方法
- default だけ指定してもデフォルト値は設定されずにヘルプが表示される
defaultだけを指定した場合
# --で始まらない引数は位置引数
ap.add_argument('posarg1', default='default-pos')
実行結果
% python argtest.py
usage: argtest.py [-h] [--optarg OPTARG] posarg1 [posarg2]
argtest2.py: error: the following arguments are required: posarg1
- required=False を指定するとエラーになる
required=Falseを指定した場合
# --で始まらない引数は位置引数
ap.add_argument('posarg1', default='default-pos', required=False)
実行結果
% python argtest.py
Traceback (most recent call last):
File "/Users/user1/source/argtest.py", line 6, in <module>
ap.add_argument('posarg1', default='default-pos', required=False)
File "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/lib/python3.12/argparse.py", line 1459, in add_argument
kwargs = self._get_positional_kwargs(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/lib/python3.12/argparse.py", line 1575, in _get_positional_kwargs
raise TypeError(msg)
TypeError: 'required' is an invalid argument for positionals
検証環境
% python -V
Python 3.12.3
% sw_vers
ProductName: macOS
ProductVersion: 15.7.1
BuildVersion: 24G231